MongoDB BsonSerializer.Deserialize和F#

S. *_*ert 5 f# mongodb bson

以下代码段似乎正确序列化了记录,但反序列化将字段设置为其默认值.

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)

提前致谢.

Mar*_*ann 5

添加[<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)