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 아티팩트의 코드 생성기를 사용하십시오.

시리얼 라이저 코드는 다음과 같습니다.

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
왜 필요한가요?
Morten Holmgaard 19

5
... 그리고 해당 kapt 설정을 빌드에 포함하십시오. 자세한 내용은 여기 : github.com/square/moshi/blob/master/README.md#kotlin
Jesse Wilson 5

1
고마워요! @JsonClass (generateAdapter = true) 추가 + gradle 구현을 'moshi'에서 'moshi-kotlin'으로 변경 + kapt 트릭을 수행했습니다
lorenzo

0

을 사용하여 와일드 카드를 표시하지 않을 수 있습니다 @JvmSuppressWildcards.

이처럼

val adapter: JsonAdapter<List<@JvmSuppressWildcards T>> = moshi.adapter(dataListType)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.