7

का उपयोग करते समय किसी संपत्ति का प्रारंभिक मान सेट करना यदि मैं DataContractSerializer का उपयोग कर कक्षा को क्रमबद्ध कर रहा हूं और बाद में deserializing कर रहा हूं, तो मैं उन गुणों के प्रारंभिक मानों को कैसे नियंत्रित कर सकता हूं जिन्हें क्रमबद्ध नहीं किया गया था?DataContractSerializer

नीचे Person कक्षा पर विचार करें। इसका डेटा अनुबंध FirstName और LastName गुणों को क्रमबद्ध करने के लिए सेट है लेकिन IsNew संपत्ति नहीं है। मैं IsNew चाहता हूं कि यह सुनिश्चित करने के लिए कि कोई नया व्यक्ति एक नए उदाहरण के रूप में तत्काल हो रहा है या फ़ाइल से deserialized किया जा रहा है।

यह निर्माता के माध्यम से करने के लिए आसान है, लेकिन जैसा कि मैंने यह समझ DataContractSerializer के रूप में वे मानकों की आवश्यकता हो सकती निर्माता फोन नहीं करता है।

[DataContract(Name="Person")] 
public class Person 
{ 
    [DataMember(Name="FirstName")] 
    public string FirstName { get; set; } 

    [DataMember(Name = "LastName")] 
    public string LastName { get; set; } 

    public bool IsNew { get; set; } 

    public Person(string first, string last) 
    { 
     this.FirstName = first; 
     this.LastName = last; 
     this.IsNew = true; 
    } 
} 

उत्तर

10

आप एक क्रमबद्ध कॉलबैक का उपयोग कर सकते हैं। अपने व्यक्ति वर्ग के लिए निम्न विधि जोड़ें:

[OnDeserialized] 
void OnDeserialized(StreamingContext context) 
{ 
    this.IsNew = true; 
} 

एक अन्य विकल्प [DataContract] और [DataMember] विशेषताओं को दूर करने के लिए है। इस मामले में DCSerializer आपके कन्स्ट्रक्टर को deserializes जब कॉल करेगा।

+1

पावेल का उल्लेख के रूप में यह [OnDeserializing] अन्य सभी मूल्य हर बार नहीं बल्कि सिर्फ एक बार की तुलना में ओवरराइट किया जाएगा होना चाहिए (जब यह याद आ रही थी)। –

14

वास्तव में यह ऐसा करने का सही तरीका OnDeserializing विशेषता (नोटिस "ing" प्रत्यय) का उपयोग कर रहा है। इस विशेषता के साथ चिह्नित विधि को सदस्य मानों को deserialized से पहले बुलाया जाता है।

+0

धन्यवाद। हां, OnDeserializing सही तरीका है। यह डिफ़ॉल्ट मान को सेट करने की अनुमति देता है जिसे स्रोत के मूल्य के स्रोत पर ओवरराइट किया जा सकता है। – Hong

संबंधित मुद्दे