首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >KMongo自定义序列化程序: readEndDocument只能在状态为END_OF_DOCUMENT时调用,而不能在状态为值时调用

KMongo自定义序列化程序: readEndDocument只能在状态为END_OF_DOCUMENT时调用,而不能在状态为值时调用
EN

Stack Overflow用户
提问于 2022-02-08 20:02:37
回答 1查看 130关注 0票数 1

我正在尝试使用Color依赖项为kmongo-coroutine-serialization类定制序列化程序。我在做这件事时遇到了一个例外:

代码语言:javascript
复制
Exception in thread "main" org.bson.BsonInvalidOperationException: readEndDocument can only be called when State is END_OF_DOCUMENT, not when State is VALUE.

文档--我把它测试为json

代码语言:javascript
复制
{
    "_id": {
        "$oid": "61fe4f745064370bd1473c41"
    },
    "id": 1,
    "color": "#9ac0db"
}

ExampleDocument 类:

代码语言:javascript
复制
@Serializable
data class ExampleDocument(
    @Serializable(with = ColorHexSerializer::class) val color: Color
)

ColorHexSerializer 对象:用于测试的--我总是返回蓝色

代码语言:javascript
复制
internal object ColorHexSerializer : KSerializer<Color> {
    override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("color_hex", PrimitiveKind.STRING)

    override fun serialize(encoder: Encoder, value: Color) {
        val hex = String.format("#%06x", value.rgb and 0xFFFFFF)
        encoder.encodeString(hex)
    }

    override fun deserialize(decoder: Decoder): Color {
        return Color.BLUE
    }
}

主要功能:

代码语言:javascript
复制
suspend fun main() {
    registerSerializer(ColorHexSerializer)
    val document =
        KMongo.createClient("connectionString")
            .getDatabase("database")
            .getCollectionOfName<ExampleDocument>("testing")
            .find(eq("id", 1))
            .awaitFirst()
}

将bson文档转换为json并反序列化它,然后使用kotlinxserialization工作得很好。这里有人能帮我吗?

提前感谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-09 15:54:13

来自documentation of Decoder

反序列化过程采用解码器,并向他请求由反序列化器串行形式定义的原语元素序列,而解码器知道如何从实际格式表示中检索这些原语元素。

更具体地说,序列化要求解码器提供一个序列“给我一个int,给我一个双,给我一个字符串列表,并给我一个嵌套的int对象”。

您需要按顺序指定从解码器读取的所有值。所有写入的值也需要读取。kotlinx.serialization似乎忽略了在kmongo抛出异常时读取剩余内容的错误(至少在您的情况下是这样)。

默认情况下,通过返回蓝色颜色,可以跳过读取字符串的步骤,导致字符串将被留下。

由于还剩一个字符串,所以对象的状态是VALUE (在尝试完成文档读取时,还有一个要读取的值)。

代码语言:javascript
复制
override fun deserialize(decoder: Decoder): Color {
    decoder.decodeString()
    return Color.BLUE
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71040195

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档