kotlinx.serialization - 使用自定义 DateSerializer 将 ArrayList<Date> 序列化为数据类变量

Posted

技术标签:

【中文标题】kotlinx.serialization - 使用自定义 DateSerializer 将 ArrayList<Date> 序列化为数据类变量【英文标题】:kotlinx.serialization - Serialize ArrayList<Date> as data class variable with custom DateSerializer 【发布时间】:2019-07-20 04:58:51 【问题描述】:

我需要使用自定义 DateSerializer 将 ArrayList 序列化为数据类变量, 对于单个日期变量,我使用注释:

@Serializable
      data class SearchBundle(
      @Serializable(with = DateSerializer::class) var startDate: Date? = null)

有人知道如何处理日期数组列表吗?

【问题讨论】:

【参考方案1】:

可能比您当前的方法更容易通过UseSerializers-annotation 在您的SearchBundle-class 的文件级别指定DateSerializer,例如:

@file:UseSerializers(DateSerializer::class)

import kotlinx.serialization.*
import java.util.*

@Serializable
data class SearchBundle(
        var startDate: List<Date>? = null)

这样您就可以保持 DateSerializer 原样,而您的其余代码也可以正常工作,即它将自动为该文件中的所有 Date 类型使用 DateSerializer

【讨论】:

一个有趣的解决方案,我不知道您可以在文件级别分配序列化程序,我会尝试,谢谢。【参考方案2】:
@Serializable
class TestDates(
    @Optional @Serializable(with = DatesArraySerializer::class) var dates: ArrayList<Date>? = null
)

object DatesArraySerializer : KSerializer<ArrayList<Date>> 

    override val descriptor = ArrayClassDesc(DateSerializer.descriptor)

    override fun serialize(encoder: Encoder, obj: ArrayList<Date>) 
        encoder.encodeSerializableValue(ArrayListSerializer(DateSerializer), obj)
    

    override fun deserialize(decoder: Decoder): ArrayList<Date> 
        val dates = decoder.decodeSerializableValue(ArrayListSerializer(DateSerializer))

        return dates.toList() as ArrayList<Date>
    

【讨论】:

以上是关于kotlinx.serialization - 使用自定义 DateSerializer 将 ArrayList<Date> 序列化为数据类变量的主要内容,如果未能解决你的问题,请参考以下文章

无法解析 org.jetbrains.kotlinx:kotlinx-gradle-serialization-plugin:0.5.1

用 Javalin 框架中的 kotlinx.serialization 替换 Jackson

如何使用 kotlinx.serialization 将库类序列化为 Protobuf?

如何使用 kotlinx.serialization 部分解码 JSON 字符串?

使用 kotlinx.serialization 在 ktor 服务器中接收 Map

kotlinx.serialization.SerializationException:找不到类“MultiPartFormDataContent”的序列化程序