Moshi 1.9.1 Não é possível serializar o tipo Kotlin


12

Eu tenho um código de trabalho serializando / desserializando dados usando o Moshi 1.8.0

A atualização para 1.9.1 agora leva a uma falha ao tentar serializar:

java.lang.IllegalArgumentException: Não é possível serializar o tipo Kotlin com.xxx.Spot. A serialização reflexiva das classes Kotlin sem usar o kotlin-reflect possui um comportamento indefinido e inesperado. Use KotlinJsonAdapter do artefato moshi-kotlin ou use gen do código do artefato moshi-kotlin-codegen.

Aqui está o código do serializador:

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)

e a classe T correspondente é

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

Eu sou totalmente ignorante sobre o que fazer aqui.

Obrigado pela ajuda!


mostra-nos as dependências que você está usando
coroutineDispatcher

Respostas:


14

Você precisa adicionar @JsonClass (generateAdapter = true) antes da sua classe de dados

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

2
Por que isso é necessário?
Morten Holmgaard 01/11/19

5
... e inclua a configuração correspondente do kapt na sua compilação. Detalhes aqui: github.com/square/moshi/blob/master/README.md#kotlin
Jesse Wilson

11
Obrigado, funcionou! Adicionando @JsonClass (generateAdapter = true) + alterando a implementação gradle de 'moshi' para 'moshi-kotlin' + kapt fez o truque
lorenzo

0

Você pode suprimir curingas usando @JvmSuppressWildcards.

como isso

val adapter: JsonAdapter<List<@JvmSuppressWildcards T>> = moshi.adapter(dataListType)
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.