【问题标题】:KMongo serialization of BSONTimestampBSONTimestamp的KMongo序列化
【发布时间】:2017-06-29 14:07:49
【问题描述】:

我正在尝试使用 Kotlins KMongo lib 序列化 BSONTimestamp。但在 MongoDb 中,我只看到它的字符串表示。

"someVal" : {
    "inc" : 1,
    "time" : 1495104096
}

我需要给 Jackson 放一些 Annotation 才能正确序列化它吗?

【问题讨论】:

    标签: jackson kotlin


    【解决方案1】:

    我怀疑这实际上与 KMongo 有什么关系,但您可以尝试将其报告给 github 问题。作者反应灵敏。

    但是,我将此视为 Jackson 序列化问题,因此在我看来解决该问题的最佳方法是创建类似于

    的序列化规则
    object BSONTimestampModule : SimpleModule("BSONTimestampModule") {
        init {
            addSerializer(BSONTimestamp::class.java, object : JsonSerializer<BSONTimestamp>() {
                override fun serialize(value: BSONTimestamp?, gen: JsonGenerator, serializers: SerializerProvider?)
                        = gen.writeString(value?.time)
            })
        }
    }
    

    我不知道 BSONTimestamp 应该保存的确切内容,因此您可能需要对其进行一些调整,但是一旦定义了模块,请使用 Jackson Mapper 将其注册,例如

    KMongoConfiguration.extendedJsonMapper.registerModule(BSONTimestampModule)

    【讨论】:

      【解决方案2】:

      听起来您指的是 BsonTimestamp,然后哪个是 mongo-java 默认使用的(实际上与 KMongo 无关)。 BSONTimestamp 是 mongo “内部”使用的特殊实现,通常不被外部任何人使用。 org.bson.types 包中的所有内容也是如此。这些不是您的正常合同,更多的是用于二进制级别或驱动程序级别与 mongo 的交互。

      BsonTimestamp(在 org.bson 包中)确实是您通过任何 mongos 日期转换返回/返回的实际数据类型。

      抱歉,我看到您使用全大写 BSON,并假设您打算做一些更高级的事情。

      【讨论】:

        【解决方案3】:

        答案很简单,我使用了错误的 BSONTimestamp 类。 出于某种原因,有两个,一个在 org.bson 中,一个在 org.bson.types 中。 使用来自 org.bson 的类,KMongo 在 Serializer 中的构建完成了它的工作 - 呵呵!

        【讨论】:

          猜你喜欢
          • 2020-11-13
          • 1970-01-01
          • 2021-11-20
          • 2020-04-30
          • 1970-01-01
          • 2012-08-12
          • 1970-01-01
          • 2023-03-08
          • 2018-11-10
          相关资源
          最近更新 更多