Android Kotlin中的Moshi – 将ENUM作为MutableMap键在非集成化时转换为字符串

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

在这里输入图像描述

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

在这里输入图像描述

它怎么能够给我一个错误的类型的地图? 我做错了什么?

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

 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提供正确序列化地图所需的信息。