2

这是返回 LocalDates 地图的 Ktor 路线:

route {
   get {
       val map = mapOf(LocalDate.now() to "test")
       call.respond(map)
   }
}

LocalDate 不可序列化,但是:

kotlinx.serialization.SerializationException: Can't locate argument-less serializer for class LocalDate. For generic classes, such as lists, please provide serializer explicitly.

我已经构建了自己的序列化程序:

@Serializer(forClass = LocalDate::class)
object LocalDateSerializer : KSerializer<LocalDate> {
    override fun serialize(encoder: Encoder, value: LocalDate) {
        encoder.encodeString(value.toString())
    }

    override fun deserialize(decoder: Decoder): LocalDate {
        return LocalDate.parse(decoder.decodeString())
    }
}

我可以在数据类中使用这个序列化程序,例如data class Foo(@Serializable(with=LocalDateSerializer::class)date: LocalDate. 但我不知道如何让它与我的地图一起使用。

我尝试了几个不同的注释:

val map: Map<@ContextualSerialization LocalDate, String> = mapOf(LocalDate.now() to "test")
// OR
val map: Map<@Serializable(with=LocalDateSerializer::class) LocalDate, String> = mapOf(LocalDate.now() to "test")

我试过用 Ktor 注册它:

install(ContentNegotiation) {
    json(module = serializersModuleOf(LocalDate::class, LocalDateSerializer))
}

无论我尝试什么,我都会得到与SerializationException上面相同的结果。

当 kotlinx.serialization 尝试解析 LocalDate 时,如何自动应用我的序列化程序?或者,当 Ktor 尝试序列化我的地图时,我如何建议使用序列化程序?

4

0 回答 0