我想使用我自己的自定义KSerializer<LocalDateTime>
与kotlinx.serialization
和kotlinx.datetime
@ExperimentalSerializationApi
@Serializer(forClass = LocalDateTime::class)
object LocalDateTimeSerializer : KSerializer<LocalDateTime> {
...
我创建我的Json
如下:
val JSON = Json {
prettyPrint = true; prettyPrintIndent = " ".repeat(2)
serializersModule = this.serializersModule.apply {
overwriteWith(
SerializersModule {
contextual(Instant::class, InstantSerializer)
contextual(LocalDateTime::class, LocalDateTimeSerializer)
}
)
}
}
但是无论我尝试什么,我都无法成功地将默认的LocalDateTimeIso8601Serializer
替换为我的:
val l = JSON.decodeFromString<LocalDateTime>(s) // does NOT(!) use my own Serializer
// have to give it explicitly to work, but that's not what I want
val l = JSON.decodeFromString<LocalDateTime>(LocalDateTimeSerializer, s) // works, but explicitly
是否可以替换默认的序列化器??
有人知道吗?
这是不可能的
最接近你想要实现的是为一个完整的文件指定一个默认的序列化器。
如果我没弄错的话,这样做的原因是kotlinx序列化是一个无反射序列化器;所有序列化器都在编译时定义。应用@Contextual
是一种禁用该行为的方法,并在运行时根据上下文(而不是您在这里所追求的)确定序列化器。我猜你可以请求一个功能来应用一个默认的序列化器到一个完整的模块(可能已经请求),但我可以看到它是如何更难实现/可能导致更多意外的冲突/行为比在文件范围,这就是为什么它可能目前不支持。
作为一种技巧,您可以考虑为LocalDateTime
使用使用自定义序列化器的包装器类型。但是,我不建议这样做。从本质上讲,这与在任何地方应用注释是一样的,因为在任何情况下,您都需要确保使用正确的类型。