MongoDB BsonSerializer.反序列化并#
下面的代码段似乎正确地序列化了记录,但反序列化将字段设置为其默认值MongoDB BsonSerializer.反序列化并#,mongodb,f#,bson,Mongodb,F#,Bson,下面的代码段似乎正确地序列化了记录,但反序列化将字段设置为其默认值 open MongoDB.Bson open MongoDB.Bson.Serialization open System module BsonIssue = type MyData = { Id : ObjectId Time : DateTime } let serialize(data : MyData) =
open MongoDB.Bson
open MongoDB.Bson.Serialization
open System
module BsonIssue =
type MyData =
{
Id : ObjectId
Time : DateTime
}
let serialize(data : MyData) =
let doc = BsonDocument()
BsonSerializer.Serialize<MyData>(new IO.BsonDocumentWriter(doc), data)
doc
let deserialize(doc : BsonDocument) =
printfn "Attempting to deserialize %A" doc
BsonSerializer.Deserialize<MyData>(doc)
let data = { Id = ObjectId.GenerateNewId(); Time = DateTime.Now }
printfn "The data: %A" data
let serialized = serialize data
printfn "After serialization: %A" serialized
let deserialized = deserialize serialized
printfn "After deserialization: %A" deserialized
提前感谢。将以下内容添加到您的记录中:
[<CLIMutable>]
type MyData =
{
Id : ObjectId
Time : DateTime
}
但是,请注意记录不能正确往返,因为时间
值不同-至少在我的机器上是这样。两个小时的时差似乎可以解释为我目前比UTC早两个小时,因此我猜测BSON(反)序列化程序将所有DateTime
值解释为UTC值
您应该使用以下方法来解决此问题:
非常感谢。有趣的是,我选择使用DateTime只是为了举例说明。这也很好。
[<CLIMutable>]
type MyData =
{
Id : ObjectId
Time : DateTime
}
> let data = { Id = ObjectId.GenerateNewId(); Time = DateTime.Now };;
val data : MyData = {Id = 55dea10c4bd766216837843d;
Time = 27.08.2015 07:33:00;}
> let serialized = serialize data;;
val serialized : BsonDocument
> let deserialized = deserialize serialized;;
val deserialized : MyData = {Id = 55dea10c4bd766216837843d;
Time = 27.08.2015 05:33:00;}
[<CLIMutable>]
type MyData =
{
Id : ObjectId
Time : DateTimeOffset
}
> let data = { Id = ObjectId.GenerateNewId(); Time = DateTimeOffset.Now };;
val data : MyData = {Id = 55dea3534bd766216837843f;
Time = 27.08.2015 07:42:43 +02:00;}
> let serialized = serialize data;;
val serialized : BsonDocument
> let deserialized = deserialize serialized;;
val deserialized : MyData = {Id = 55dea3534bd766216837843f;
Time = 27.08.2015 07:42:43 +02:00;}
> data = deserialized;;
val it : bool = true