2015-08-27 8 views
5

निम्न स्निपेट रिकॉर्ड को क्रमबद्ध करने के लिए प्रतीत होता है, लेकिन deserialization फ़ील्ड को उनके डिफ़ॉल्ट मानों पर सेट करता है।MongoDB BsonSerializer.Deserialize और 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 

यहाँ उत्पादन का एक उदाहरण है:

डेटा:

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

अग्रिम धन्यवाद।

उत्तर

5

अपने रिकॉर्ड के लिए [<CLIMutable>] जोड़ें:

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

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

क्या, तथापि,, ध्यान दें कि रिकॉर्ड राउंड ट्रिप सही ढंग से नहीं है क्योंकि Time मूल्यों अलग - कम से कम मेरी मशीन पर। दो घंटे का समय अंतर इस तथ्य से समझा जा सकता है कि मैं वर्तमान में यूटीसी से दो घंटे पहले हूं, इसलिए मेरा अनुमान है कि बीएसओएन (डी) धारावाहिक यूटीसी मूल्यों के रूप में सभी DateTime मानों को समझता है।

इसके बजाय आप DateTimeOffset का उपयोग करके इस मुद्दे के समाधान करना चाहिए:

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

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

धन्यवाद बहुत बहुत। मजेदार क्योंकि मैंने एक उदाहरण बनाने के लिए डेटटाइम का उपयोग करना चुना है। उस पर अच्छी पकड़ भी। –