【问题标题】:How to write KSerializer for Map having custom objects如何为具有自定义对象的 Map 编写 KSerializer
【发布时间】:2021-10-21 14:54:30
【问题描述】:

我想使用 kotlinx-serializer 序列化以下类。

但由于它包含具有自定义类型的 Map - HttpUrlList<Cookie>,因此会出错

  1. 找不到类型“HttpUrl”的序列化程序
  2. 找不到类型“Cookie”的序列化程序

查看 kotlinx 序列化 文档时,我似乎需要为上述地图类型创建一个 custom KSerializer。所以我可以像下面这样添加它。

@Serializable(with = CookieSerializer::class)
val cookies: Map<HttpUrl, List<Cookie>> = emptyMap()

我正在研究有关如何创建自定义 CookieSerializer 的一些输入,我尝试使用以下方法,只是为了查看编译时错误是否已解决。

@Serializer(forClass = Map::class)
object CookieSerializer : KSerializer<Map<HttpUrl, List<Cookie>>> {
    override val descriptor: SerialDescriptor =
        PrimitiveSerialDescriptor("Cookie", PrimitiveKind.STRING)

    override fun serialize(encoder: Encoder, value: Map<HttpUrl, List<Cookie>>) {

    }

    override fun deserialize(decoder: Decoder): Map<HttpUrl, List<Cookie>> {
        return emptyMap()
    }
}

但我仍然收到错误消息。

【问题讨论】:

    标签: android kotlin kotlinx.serialization


    【解决方案1】:

    错误表明HttpUrlCookie 不可序列化。如果您控制这些类的源,则可以通过应用@Serializable 使它们可序列化,就像您在此处使ApplicationConfiguration 可序列化一样。默认情况下,地图可在 kotlinx.serialization 中序列化。

    您在此处指定的代码尝试使用CookieSerializer 序列化Map&lt;HttpUrl, List&lt;Cookie&gt;&gt;(作为一个整体),这似乎没有必要。如果不控制Cookie的来源,可以指定一个序列化器使用如下:val cookies: Map&lt;HttpUrl, List&lt;@Serializable(CookieSerializer::class) Cookie&gt;&gt; .

    有关如何编写自定义序列化程序的信息,请refer to the full documentation。在编写序列化程序for generic types(例如地图)时,它比您在这里尝试做的事情要复杂一些(我建议您不要这样做,但仅供参考)。

    【讨论】:

      猜你喜欢
      • 2023-03-04
      • 2019-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-06
      • 1970-01-01
      • 2012-06-20
      相关资源
      最近更新 更多