2017-11-04 13 views
1

나는 onSaveInstanceState에 저장하고자하는 MutableMap<CryptoTypes, CurrentTradingInfo>을 가지고 있으며 앞뒤로 변환하려면 Moshi를 사용할 것입니다. CryptoTypes is an ENUM안드로이드의 Moshi Kotlin - ENUM이 MeralMap 키가 문자열로 변환 될 때 변환 됨

private var tickerData: MutableMap<CryptoTypes, CurrentTradingInfo> = mutableMapOf() 


fun convertTickerDataJson(): String { 
    val moshi = Moshi.Builder().build() 
    val jsonAdapter = moshi.adapter<MutableMap<CryptoTypes, CurrentTradingInfo>>(MutableMap::class.java) 
    return jsonAdapter.toJson(tickerData) 
} 

fun restoreTickerDataFromJson(data: String) { 
    val moshi = Moshi.Builder().build() 
    val jsonAdapter = moshi.adapter<MutableMap<CryptoTypes, CurrentTradingInfo>>(MutableMap::class.java) 
    tickerData = jsonAdapter.fromJson(data) 
} 

는 데이터를 올바르게 직렬화되어 있지만,이 직렬화 복원 때, 그것은 대신 MutableMap<String, CurrentTradingInfo> 날을 다시주고?

내가 직렬화하기 전에 나는 스튜디오에서 내 tickerData지도 살펴

, 그것은 분명 [지도가 정렬되지 않은 것입니다주의이 다시 직렬화 된 후지도 인 ENUM

enter image description here

로 ENUM을 저장하는 것 및 나는 다시 다시 실행하기 위해 다른 순서에 따라서지도 키]

enter image description here

방법이 잘못 입력 된지도를 돌려줘 할 수 있었다? 내가 뭔가 잘못하고 있는거야? 내가 tickerDataA = tickerDataB을 갈 수 없어 두 변수

private var tickerDataA: MutableMap<CryptoTypes, CurrentTradingInfo> = mutableMapOf() 

    private var tickerDataB: MutableMap<String, CurrentTradingInfo> = mutableMapOf() 

을 작성하는 경우

나는 그것이 유형부터 아래로 충돌지도 전환 후 액세스하려고

는 그것을

Java.lang.ClassCastException: java.lang.String cannot be cast to com.nebulights.crytpotracker.CryptoTypes 

잘못 형식 불일치로 보여 주므로 꼭 컴파일해야하지 않습니다.

답변

3
moshi.adapter<MutableMap<CryptoTypes, CurrentTradingInfo>>(MutableMap::class.java) 

일반 형식 MutableMap 클래스 만 제공하므로이 문제가 발생합니다. 이 때문에 키/값 형식에 특수화 된 serializer 대신 Object serializer를 사용합니다. 파라미터 화 된 형태를 만드는

봅니다 :

val type = Types.newParameterizedType(MutableMap::class.java, CryptoTypes::class.java, CurrentTradingInfo::class.java) 
val jsonAdapter = moshi.adapter<MutableMap<CryptoTypes, CurrentTradingInfo>>(type) 

이 제대로지도를 직렬화하는 데 필요한 정보를 모시를 제공해야한다.

+0

해결해 줘서 고마워! 그렇다면 Moshi가 Map 를 반환한다는 것을 의미하는 이유는 그것이 입력 된 맵에 할당 할 수 있었던 이유입니다. 유형 불일치가있는 할당 라인에서 충돌이 발생하지 않았다는 사실에 놀랐습니다. – Ben987654

+1

당신은 타입 인자가 런타임 중에 사라지는 경향이 있다는 것을 기억해야합니다. 런타임 중에는 get()을 호출하는 동안 충돌이 발생해야합니다. – Kiskae

+0

아! 그것은 물건을 깨끗이합니다. 매우 감사. – Ben987654