Android Kotlin中的Moshi - 作为MutableMap键的ENUM在去序器时被转换为String

时间:2017-11-04 18:50:48

标签: android kotlin moshi

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

在我序列化之前查看工作室中的tickerData地图时,它显然将ENUM存储为ENUM

enter image description here

这是反序列化后的地图[注意地图是无序的,我不得不重新运行它,因此不同顺序的地图键]

enter image description here

它如何能够回复错误输入的地图?难道我做错了什么?

当我尝试访问地图转换后,由于类型错误而导致崩溃,

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,它显示为类型不匹配,并且不允许我按原样编译。

1 个答案:

答案 0 :(得分: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)

这应该为Moshi提供正确序列化地图所需的信息。