Моши 1.9.1 не может сериализовать котлинский тип

12

У меня есть рабочий код сериализации / десериализации данных с помощью Moshi 1.8.0

Обновление до 1.9.1 теперь приводит к сбою при попытке сериализации:

java.lang.IllegalArgumentException: невозможно сериализовать тип Kotlin com.xxx.Spot. Рефлексивная сериализация классов Kotlin без использования kotlin-рефлекса имеет неопределенное и неожиданное поведение. Пожалуйста, используйте KotlinJsonAdapter из артефакта moshi-kotlin или используйте code gen из артефакта moshi-kotlin-codegen.

Вот код сериализатора:

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)

и соответствующий класс T

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

Я совершенно не знаю, что здесь делать.

Спасибо за помощь!

Лоренсо
источник
покажите нам зависимости, которые вы используете
coroutineDispatcher

Ответы:

14

Вам нужно добавить @JsonClass (generateAdapter = true) перед вашим классом данных

@JsonClass(generateAdapter = true) 
data class Spot(
    var id: String = "",
    var localizedName: String? = null,
    var type: String = "",
    var location: Location? = null
)
Олле Экберг
источник
2
Зачем это нужно?
Мортен Холмгаард
5
... и включите соответствующий конфиг kapt в вашу сборку. Подробности здесь: github.com/square/moshi/blob/master/README.md#kotlin
Джесси Уилсон
1
Спасибо, это сработало! Добавление @JsonClass (generateAdapter = true) + изменение реализации gradle с 'moshi' на 'moshi-kotlin' + kapt сделали свое дело
lorenzo
0

Вы можете подавить подстановочные знаки, используя @JvmSuppressWildcards.

нравится

val adapter: JsonAdapter<List<@JvmSuppressWildcards T>> = moshi.adapter(dataListType)
Халед Касем
источник