Moshi 1.9.1无法序列化Kotlin类型


12

我有使用Moshi 1.8.0进行数据序列化/反序列化的工作代码

现在,升级到1.9.1会导致尝试序列化时崩溃:

java.lang.IllegalArgumentException:无法序列化Kotlin类型com.xxx.Spot。不使用kotlin-reflect的Kotlin类的反射序列化具有未定义和意外的行为。请使用来自moshi-kotlin工件的KotlinJsonAdapter或使用来自moshi-kotlin-codegen工件的代码gen。

这是序列化器代码:

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's

Answers:


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
为什么需要那?
Morten Holmgaard,

5
...并在您的构建中包含相应的kapt配置。此处的详细信息:github.com/square/moshi/blob/master/README.md#kotlin
Jesse Wilson

1
谢谢,成功了!添加@JsonClass(generateAdapter = true)+将gradle实现从“ moshi”更改为“ moshi-kotlin” + kapt达到了目的
lorenzo

0

您可以使用禁止通配符@JvmSuppressWildcards

像这样

val adapter: JsonAdapter<List<@JvmSuppressWildcards T>> = moshi.adapter(dataListType)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.