Android Kotlin 中的 Moshi - 枚举作为 MutableMap 键在反序列化时被转换为字符串
Moshi in Android Kotlin - ENUM as MutableMap key being converted to String when deseralized
我有一个 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
这是反序列化后的地图[注意地图是无序的,我不得不重新运行它,因此地图键的顺序不同]
它如何返回我输入错误的地图?难道我做错了什么?
当我尝试访问地图 post 转换时,由于类型错误,它因以下内容而崩溃
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
class。因此,它使用 Object
序列化器而不是专门用于 key/value 类型的序列化器。
尝试创建参数化类型:
val type = Types.newParameterizedType(MutableMap::class.java, CryptoTypes::class.java, CurrentTradingInfo::class.java)
val jsonAdapter = moshi.adapter<MutableMap<CryptoTypes, CurrentTradingInfo>>(type)
这应该会为 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
这是反序列化后的地图[注意地图是无序的,我不得不重新运行它,因此地图键的顺序不同]
它如何返回我输入错误的地图?难道我做错了什么?
当我尝试访问地图 post 转换时,由于类型错误,它因以下内容而崩溃
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
class。因此,它使用 Object
序列化器而不是专门用于 key/value 类型的序列化器。
尝试创建参数化类型:
val type = Types.newParameterizedType(MutableMap::class.java, CryptoTypes::class.java, CurrentTradingInfo::class.java)
val jsonAdapter = moshi.adapter<MutableMap<CryptoTypes, CurrentTradingInfo>>(type)
这应该会为 Moshi 提供正确序列化地图所需的信息。