Moshi 1.9.1 Không thể tuần tự hóa loại Kotlin


12

Tôi có một mã tuần tự hóa / giải tuần tự hóa dữ liệu bằng cách sử dụng Moshi 1.8.0

Nâng cấp lên 1.9.1 bây giờ dẫn đến sự cố khi cố gắng tuần tự hóa:

java.lang.IllegalArgumentException: Không thể tuần tự hóa loại Kotlin com.xxx.Spot. Phản ứng tuần tự hóa các lớp Kotlin mà không sử dụng phản xạ kotlin có hành vi không xác định và không mong muốn. Vui lòng sử dụng KotlinJsonAd CHƯƠNG từ tạo tác moshi-kotlin hoặc sử dụng gen mã từ tạo tác moshi-kotlin-codegen.

Đây là mã serializer:

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)

và lớp T tương ứng là

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

Tôi hoàn toàn không biết phải làm gì ở đây.

Cảm ơn đã giúp đỡ!


cho chúng tôi thấy sự phụ thuộc mà bạn đang sử dụng
coroutineDispatcher

Câu trả lời:


14

Bạn cần thêm @JsonClass (GenerAd Module = true) trước lớp dữ liệu của bạn

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

2
Tại sao cần thiết?
Morten Holmgaard

5
... Và bao gồm cấu hình kapt tương ứng trong bản dựng của bạn. Chi tiết tại đây: github.com/sapes/moshi/blob/master/README.md#kotlin
Jesse Wilson

1
Cảm ơn, nó đã làm việc! Thêm @JsonClass (createdAd CHƯƠNG = true) + thay đổi cách triển khai lớp từ 'moshi' thành 'moshi-kotlin' + kapt đã thực hiện thủ thuật
lorenzo

0

Bạn có thể ngăn chặn các thẻ hoang dã bằng cách sử dụng @JvmSuppressWildcards.

như thế này

val adapter: JsonAdapter<List<@JvmSuppressWildcards T>> = moshi.adapter(dataListType)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.