【发布时间】:2017-06-29 14:07:49
【问题描述】:
我正在尝试使用 Kotlins KMongo lib 序列化 BSONTimestamp。但在 MongoDb 中,我只看到它的字符串表示。
"someVal" : {
"inc" : 1,
"time" : 1495104096
}
我需要给 Jackson 放一些 Annotation 才能正确序列化它吗?
【问题讨论】:
我正在尝试使用 Kotlins KMongo lib 序列化 BSONTimestamp。但在 MongoDb 中,我只看到它的字符串表示。
"someVal" : {
"inc" : 1,
"time" : 1495104096
}
我需要给 Jackson 放一些 Annotation 才能正确序列化它吗?
【问题讨论】:
我怀疑这实际上与 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)
【讨论】:
听起来您指的是 BsonTimestamp,然后哪个是 mongo-java 默认使用的(实际上与 KMongo 无关)。 BSONTimestamp 是 mongo “内部”使用的特殊实现,通常不被外部任何人使用。 org.bson.types 包中的所有内容也是如此。这些不是您的正常合同,更多的是用于二进制级别或驱动程序级别与 mongo 的交互。
BsonTimestamp(在 org.bson 包中)确实是您通过任何 mongos 日期转换返回/返回的实际数据类型。
抱歉,我看到您使用全大写 BSON,并假设您打算做一些更高级的事情。
【讨论】:
答案很简单,我使用了错误的 BSONTimestamp 类。 出于某种原因,有两个,一个在 org.bson 中,一个在 org.bson.types 中。 使用来自 org.bson 的类,KMongo 在 Serializer 中的构建完成了它的工作 - 呵呵!
【讨论】: