Моши в Android Kotlin – ENUM, поскольку ключ MutableMap преобразуется в String при его

У меня есть 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

введите описание изображения здесь

Это карта после десериализации назад [обратите внимание, что карта неупорядочена, и мне пришлось повторно запустить ее снова, поэтому ключи карты в разных порядках]

введите описание изображения здесь

Как он может вернуть неверно типизированную карту? Я делаю что-то неправильно?

Когда я пытаюсь получить доступ к преобразованию в почтовую карту, он падает с нижеследующим, поскольку тип неправилен

 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) 

Это должно предоставить Моши информацию, необходимую для правильной сериализации карты.