Moshi 1.9.1 Kotlin-Typ kann nicht serialisiert werden


12

Ich habe einen Arbeitscode zum Serialisieren / Deserialisieren von Daten mit Moshi 1.8.0

Ein Upgrade auf 1.9.1 führt jetzt zu einem Absturz beim Versuch der Serialisierung:

java.lang.IllegalArgumentException: Kotlin-Typ com.xxx.Spot kann nicht serialisiert werden. Die reflektierende Serialisierung von Kotlin-Klassen ohne Verwendung von Kotlin-Reflect hat ein undefiniertes und unerwartetes Verhalten. Bitte verwenden Sie KotlinJsonAdapter aus dem Moshi-Kotlin-Artefakt oder Code Gen aus dem Moshi-Kotlin-Codegen-Artefakt.

Hier ist der Serializer-Code:

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)

und die entsprechende T-Klasse ist

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

Ich habe keine Ahnung, was ich hier tun soll.

Danke für die Hilfe!


Zeigen Sie uns die Abhängigkeiten, die Sie verwenden
coroutineDispatcher

Antworten:


14

Sie müssen @JsonClass (generateAdapter = true) vor Ihrer Datenklasse hinzufügen

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

2
Warum wird das benötigt?
Morten Holmgaard

5
... und fügen Sie die entsprechende kapt-Konfiguration in Ihren Build ein. Details hier: github.com/square/moshi/blob/master/README.md#kotlin
Jesse Wilson

1
Danke, es hat funktioniert! Das Hinzufügen von @JsonClass (generateAdapter = true) + Ändern der Gradle-Implementierung von 'moshi' in 'moshi-kotlin' + kapt hat den Trick gemacht
Lorenzo

0

Sie können Platzhalter mit unterdrücken @JvmSuppressWildcards.

so was

val adapter: JsonAdapter<List<@JvmSuppressWildcards T>> = moshi.adapter(dataListType)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.