如何在 Kotlin 协程驱动程序中为
@Contextual
带注释的类型添加序列化器?
我的代码如下:
@Serializable
data class D(@Contextual val d: LocalDate)
fun main() {
val d = D(LocalDate.now())
val json = Json {
serializersModule += SerializersModule {
contextual(LocalDateSerializer)
}
}
println(json.encodeToString(d)) // {"d":"2024-04-09"}
val client = MongoClient.create(url)
val test = client.getDatabase("web-im")
.getCollection<D>("test")
runBlocking {
test.insertOne(d) // Error
}
}
我得到了错误:
Exception in thread "main" kotlinx.serialization.SerializationException: Serializer for class 'LocalDate' is not found.
Please ensure that class is marked as '@Serializable' and that the serialization compiler plugin is applied.
我可以将我的
LocalDateSerializer
添加到 MongoDB 使用的 serializersModule
吗?
我找到了,使用
KotlinSerializerCodecProvider
:
@Serializable
data class D(@Contextual val d: LocalDate)
fun main() {
val d = D(LocalDate.now())
val client = MongoClient.create(url)
val kotlinProvider = KotlinSerializerCodecProvider(
SerializersModule { contextual(LocalDateSerializer) }
)
val test = client.getDatabase("web-im")
.withCodecRegistry(
CodecRegistries.fromRegistries(
CodecRegistries.fromProviders(kotlinProvider)
)
)
.getCollection<D>("test")
runBlocking {
test.insertOne(d)
}
}