以下代码段似乎正确序列化了记录,但反序列化将字段设置为其默认值.
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
Run Code Online (Sandbox Code Playgroud)
以下是输出示例:
数据:
{Id = 55de887754893731fceeef58;
Time = 8/26/2015 11:48:07 PM;}
After serialization: seq [_t=MyData; _id=55de887754893731fceeef58; Time=2015-08-27T03:48:07.836Z]
Attempting to deserialize seq [_t=MyData; _id=55de887754893731fceeef58; Time=2015-08-27T03:48:07.836Z]
After deserialization: {Id = 000000000000000000000000;
Time = 1/1/0001 12:00:00 AM;}
Run Code Online (Sandbox Code Playgroud)
提前致谢.
添加[<CLIMutable>]到您的记录:
[<CLIMutable>]
type MyData =
{
Id : ObjectId
Time : DateTime
}
Run Code Online (Sandbox Code Playgroud)
FSI会议:
> 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;}
Run Code Online (Sandbox Code Playgroud)
但请注意,记录不能正确往返,因为Time值不同 - 至少在我的机器上.两小时的时差似乎可以通过我比UTC目前提前两小时来解释,所以我的猜测是BSON(de)序列化器将所有DateTime值都解释为UTC值.
您应该使用以下方式解决此问题DateTimeOffset:
[<CLIMutable>]
type MyData =
{
Id : ObjectId
Time : DateTimeOffset
}
Run Code Online (Sandbox Code Playgroud)
FSI会议:
> 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
Run Code Online (Sandbox Code Playgroud)