2017-11-04 2 views
1

onSaveInstanceStateに保存したいと思っているMutableMap<CryptoTypes, CurrentTradingInfo>を持っていて、前後に変換するためにMoshiを使用しようとしていました。 CryptoTypes is an ENUMAndroidのMoshi Kotlin - ENUMをMutableMapキーとして文字列に変換するときに文字列に変換する

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

どのようにそれは間違って入力したマップを私にお返しすることができましたか?私は何か間違っているのですか?

私はタイプが私は2つの変数

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

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

を作成した場合、私はtickerDataA = tickerDataBを行くことができない

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

間違っているので、それは以下でクラッシュマップポスト変換にアクセスしようと、それは型の不一致として表示され、私はそれをコンパイルする必要はありません。

答えて

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

この問題は完全な種類を提供していないため、汎用のMutableMapクラスのみを提供しているために発生します。このため、キー/値型に特化したものではなく、Objectシリアライザを使用します。

は、パラメータ化された型を作成してみてください:

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

関連する問題