2015-08-27 19 views
5

Aşağıdaki snippet, kaydı doğru şekilde serileştirmek için görünür, ancak seriyi ayıklamak alanları varsayılan değerlerine ayarlar. İşte MongoDB BsonSerializer.Deserialize ve F #

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 

çıktı örneğidir:

veriler: önceden

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

teşekkürler.

cevap

5

sizin rekor [<CLIMutable>] ekleyin:

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

FSI oturumu:

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

Do, Time değerleri farklı olduğundan Ancak, rekor doğru gidiş-dönüş değil fark - en azından makinemde. İki saatlik zaman farkı şu anda UTC'den iki saat ileride olduğum gerçeğiyle açıklanabilir gibi görünüyor, bu yüzden benim tahminim BSON (de) serializer'ın tüm DateTime değerlerini UTC değerleri olarak yorumlaması.

yerine DateTimeOffset kullanarak bu sorunu ele almalıdır:

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

FSI oturumu:

> 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 
+0

Çok teşekkürler. Komik çünkü sadece bir örnek vermek için DateTime'ı kullanmayı tercih ettim. Bunun üzerinde de iyi yakalayın. –