我有一个MutableMap<CryptoTypes, CurrentTradingInfo>
,我想保存为onSaveInstanceState
,并打算使用Moshi来回转换。 CryptoTypes is an ENUM
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>
吗?当我在序列化之前在studio中查看我的tickerData映射时,显然是将ENUM存储为ENUM
这是反序列化后的 map (请注意,该 map 是无序的,我不得不再次运行它,因此, map 键的顺序不同)
怎样才能给我返回错误键入的 map ?难道我做错了什么?
当我尝试访问 map 发布转换时,由于类型错误,它崩溃并显示以下内容
Java.lang.ClassCastException: java.lang.String cannot be cast to com.nebulights.crytpotracker.CryptoTypes
如果我创建两个变量
private var tickerDataA: MutableMap<CryptoTypes, CurrentTradingInfo> = mutableMapOf()
private var tickerDataB: MutableMap<String, CurrentTradingInfo> = mutableMapOf()
我不能使用
tickerDataA = tickerDataB
,它显示为类型不匹配,并且不会让我按需编译。 最佳答案
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)
这应该为Moshi提供正确序列化 map 所需的信息。
关于android - Android Kotlin中的Moshi-枚举化时将ENUM作为MutableMap键转换为String,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47114344/