MongoDB BsonSerializer.Deserialize and F #

The following code snippet appears to properly serialize the record, but deserialization sets the default field values.

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 

Here is an example output:

Data:

 {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;} 

Thanks in advance.

+5
source share
1 answer

Add [<CLIMutable>] to your entry:

 [<CLIMutable>] type MyData = { Id : ObjectId Time : DateTime } 

FSI session:

 > 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;} 

However, note that the record is not rounded to the right , because the Time values ​​are different - at least on my machine. The two-hour time difference seems to be explained by the fact that I'm two hours earlier than UTC, so I assume the BSON (de) serializer interprets all DateTime values ​​as UTC values.

You should solve this problem using DateTimeOffset :

 [<CLIMutable>] type MyData = { Id : ObjectId Time : DateTimeOffset } 

FSI session:

 > 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 
+5
source

All Articles