Kotlin - 如何向 MongoDB 添加序列化器

问题描述 投票:0回答:1

如何在 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
吗?

mongodb kotlin serialization
1个回答
0
投票

我找到了,使用

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)
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.