我有一个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

android - Android Kotlin中的Moshi-枚举化时将ENUM作为MutableMap键转换为String-LMLPHP

这是反序列化后的 map (请注意,该 map 是无序的,我不得不再次运行它,因此, map 键的顺序不同)

android - Android Kotlin中的Moshi-枚举化时将ENUM作为MutableMap键转换为String-LMLPHP

怎样才能给我返回错误键入的 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/

10-13 05:00