Moshi 1.9.1 Nie można serializować typu Kotlin


12

Mam działający kod serializujący / deserializujący dane za pomocą Moshi 1.8.0

Aktualizacja do wersji 1.9.1 prowadzi teraz do awarii podczas próby serializacji:

java.lang.IllegalArgumentException: Nie można serializować typu Kotlin com.xxx.Spot. Serial refleksyjny klas Kotlin bez użycia kotlin-reflect ma nieokreślone i nieoczekiwane zachowanie. Użyj KotlinJsonAdapter z artefaktu moshi-kotlin lub użyj kodu gen z artefaktu moshi-kotlin-codegen.

Oto kod serializatora:

val moshi = Moshi.Builder().build()
val dataListType = newParameterizedType(List::class.java, T::class.java)
val adapter: JsonAdapter<List<T>> = moshi.adapter(dataListType)
val json = adapter.toJson(dataList)

a odpowiednia klasa T to

@IgnoreExtraProperties
data class Spot(
    var id: String = "",
    var localizedName: String? = null,
    var type: String = "",
    var location: Location? = null
)

Nie mam pojęcia, co tu robić.

Dzięki za pomoc!


pokaż nam zależności, których używasz
coroutineDispatcher

Odpowiedzi:


14

Musisz dodać @JsonClass (generateAdapter = true) przed klasą danych

@JsonClass(generateAdapter = true) 
data class Spot(
    var id: String = "",
    var localizedName: String? = null,
    var type: String = "",
    var location: Location? = null
)

2
Dlaczego to jest potrzebne?
Morten Holmgaard,

5
... i dołącz odpowiednią konfigurację kaptura do swojej kompilacji. Szczegóły tutaj: github.com/square/moshi/blob/master/README.md#kotlin
Jesse Wilson

1
Dzięki, działało! Dodanie @JsonClass (generateAdapter = true) + zmiana implementacji stopni z „moshi” na „moshi-kotlin” + kapt załatwiła sprawę
lorenzo,

0

Możesz stłumić dzikie karty za pomocą @JvmSuppressWildcards.

lubię to

val adapter: JsonAdapter<List<@JvmSuppressWildcards T>> = moshi.adapter(dataListType)
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.