微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用kontlinx.serialization序列化泛型类?

如何解决如何使用kontlinx.serialization序列化泛型类?

我遵循tutorial为我的通用类创建自定义序列化。但是我仍然充满错误

SerializationException:类“ ApiResponse”的序列化器不是 找到了。将类标记为@Serializable或提供序列化器 明确地。

我的ApiResponse类如下:

@Serializable(with = ApiResponseSerializer::class)
class ApiResponse<T>(
    @SerialName("data")
    val data: T? = null,@SerialName("error")
    val error: ApiError? = null
)

上面注释中使用的ApiResponseSerializer是:

class ApiResponseSerializer<T>(private val dataSerializer: KSerializer<T>) : KSerializer<ApiResponse<T>> {
    override val descriptor: SerialDescriptor = buildClassSerialDescriptor("ApiResponseDataSerializer") {
        val dataDescriptor = dataSerializer.descriptor
        element("data",dataDescriptor)
        element("error",ApiError.serializer().descriptor)
    }
    override fun deserialize(decoder: Decoder): ApiResponse<T> =
        decoder.decodeStructure(descriptor) {
            var data: T? = null
            var error: ApiError? = null
            loop@ while (true) {
                when (val i = decodeElementIndex(descriptor)) {
                    0 -> data = decodeSerializableElement(descriptor,i,dataSerializer)
                    1 -> error = decodeSerializableElement(descriptor,ApiError.serializer())
                    CompositeDecoder.DECODE_DONE -> break
                    else -> throw SerializationException("UnkNown index $i")
                }
            }
            ApiResponse(data,error)
        }
    override fun serialize(encoder: Encoder,value: ApiResponse<T>) {
        encoder.encodeStructure(descriptor) {
            encodeNullableSerializableElement(descriptor,dataSerializer,value.data)
            encodeNullableSerializableElement(descriptor,1,ApiError.serializer(),value.error)
        }
    }
}

然后,当我尝试序列化数据对象时,会收到上面提到的异常。

Json.encodetoString(ApiResponse(data = response.data))
---- OR ----
Json.encodetoString(ApiResponse.serializer(T::class.serializer()),ApiResponse(data = response.data))

有人可以告诉我我错了吗?谢谢。

解决方法

问题中的代码很好,由于缓存不足或其他原因导致程序失败。

,

这似乎是 kapt 的错误。

我从序列化存储库中找到了这个 comment :

但是,由于提到的 kapt 问题,现在是不可能的。一个可行的解决方法可能是将模型和序列化器移到单独的 Gradle 模块中,该模块不由 kapt 处理。

关于这个问题还有更多问题:

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。