Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin 如何使用kontlinx.serialization序列化泛型类?_Kotlin_Serialization_Kotlinx.serialization - Fatal编程技术网

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

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

我遵循了为泛型类创建自定义序列化的步骤。但我仍然有很多错误:

SerializationException:类“ApiResponse”的序列化程序不可用 建立将类标记为@Serializable或提供序列化程序 明确地说

我的ApiResponse类如下所示:

@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))