Kotlin 如何使用kontlinx.serialization序列化泛型类?
我遵循了为泛型类创建自定义序列化的步骤。但我仍然有很多错误: SerializationException:类“ApiResponse”的序列化程序不可用 建立将类标记为@Serializable或提供序列化程序 明确地说 我的ApiResponse类如下所示:Kotlin 如何使用kontlinx.serialization序列化泛型类?,kotlin,serialization,kotlinx.serialization,Kotlin,Serialization,Kotlinx.serialization,我遵循了为泛型类创建自定义序列化的步骤。但我仍然有很多错误: SerializationException:类“ApiResponse”的序列化程序不可用 建立将类标记为@Serializable或提供序列化程序 明确地说 我的ApiResponse类如下所示: @Serializable(with = ApiResponseSerializer::class) class ApiResponse<T>( @SerialName("data") v
@Serializable(with = ApiResponseSerializer::class)
class ApiResponse<T>(
@SerialName("data")
val data: T? = null,
@SerialName("error")
val error: ApiError? = null
)
有人能告诉我哪里错了吗?谢谢。问题中的代码很好,程序由于缓存不好或其他原因而失败。问题中的代码很好,程序由于缓存不好或其他原因而失败。这似乎是kapt的错误 我从序列化存储库中找到了以下内容: 然而,由于提到的kapt问题,目前还不可能。可能,一个可行的解决方法是将模型和序列化程序移动到单独的Gradle模块,而kapt不处理该模块 关于这个问题还有更多的问题:
- 这似乎是卡普的错误
我从序列化存储库中找到了以下内容:
然而,由于提到的kapt问题,目前还不可能。可能,一个可行的解决方法是将模型和序列化程序移动到单独的Gradle模块,而kapt不处理该模块
关于这个问题还有更多的问题:
Json.encodeToString(ApiResponse(data=“some string”)
。响应数据的类型是什么?它是否标记有@Serializable
注释?循环标签的意义是什么?在我的例子中,数据可以由任何带有@Serializable
注释的数据类表示。@循环
注释出现在文档中。到KSerializer
类,并且,根据我的理解,标记程序在中断时应返回的位置。更多:附言,现在它可以工作了。可能是坏缓存或其他原因造成的。无论如何,感谢您的测试和支持在我的机器上运行良好,支持Json.encodeToString(ApiResponse(data=“some string”)
。响应数据的类型是什么?它是否标记有@Serializable
注释?循环标签的意义是什么?在我的例子中,数据可以由任何带有@Serializable
注释的数据类表示。@循环
注释出现在文档中。到KSerializer
类,并且,根据我的理解,标记程序在中断时应返回的位置。更多:附言,现在它可以工作了。可能是坏缓存或其他原因造成的。无论如何,谢谢你的测试和支持
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, i, 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, 0, 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))