Moshi en Android Kotlin – ENUM como key MutableMap que se convierte en String cuando se desexcita

Tengo un MutableMap<CryptoTypes, CurrentTradingInfo> que quiero save en onSaveInstanceState e iba a usar Moshi para convertir de ida y vuelta. 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 restreTickerDataFromJson(data: String) { val moshi = Moshi.Builder().build() val jsonAdapter = moshi.adapter<MutableMap<CryptoTypes, CurrentTradingInfo>>(MutableMap::class.java) tickerData = jsonAdapter.fromJson(data) } 

Los datos se serializan correctamente, pero cuando se deserializan, ¿me devuelve un MutableMap<String, CurrentTradingInfo> ?

Cuando miro mi map tickerData en el estudio antes de serializarlo, está almacenando claramente el ENUM como un ENUM

enter image description here

Este es el map después de haber sido deserializado de nuevo [tenga en count que el map está desorderado y tuve que volver a ejecutarlo de nuevo, por lo tanto, las teclas del map en diferentes órdenes]

enter image description here

¿Cómo puede devolverme un map incorrectamente tipado? ¿Estoy haciendo algo mal?

Cuando bash acceder a la conversión de la publicación del map, se bloquea con el siguiente porque el tipo es incorrecto

 Java.lang.ClassCastException: java.lang.String cannot be cast to com.nebulights.crytpotracker.CryptoTypes 

Si creo dos variables

  private var tickerDataA: MutableMap<CryptoTypes, CurrentTradingInfo> = mutableMapOf() private var tickerDataB: MutableMap<String, CurrentTradingInfo> = mutableMapOf() 

No puedo ir a tickerDataA = tickerDataB , se muestra como un tipo no coincidente y no me deja comstackr como debería.

Solutions Collecting From Web of "Moshi en Android Kotlin – ENUM como key MutableMap que se convierte en String cuando se desexcita"

 moshi.adapter<MutableMap<CryptoTypes, CurrentTradingInfo>>(MutableMap::class.java) 

El problema se produce porque no proporciona el tipo completo, solo la class genérica MutableMap . Debido a esto, usa el serializador Object lugar de uno especializado para los types key / valor.

Intenta crear un tipo parametrizado:

 val type = Types.newParameterizedType(MutableMap::class.java, CryptoTypes::class.java, CurrentTradingInfo::class.java) val jsonAdapter = moshi.adapter<MutableMap<CryptoTypes, CurrentTradingInfo>>(type) 

Esto debería proporcionar a Moshi la información que necesita para serializar correctamente el map.