c# - DataContractSerializer मेरे कन्स्ट्रक्टर को कॉल नहीं करता है?




.net constructor (2)

मुझे बस कुछ पागल महसूस हुआ, जिसे मैंने पूरी तरह से असंभव माना: जब किसी ऑब्जेक्ट को deserializing, DataContractSerializer कन्स्ट्रक्टर को कॉल नहीं करता है !

उदाहरण के लिए, इस वर्ग को लें:

[DataContract]
public class Book
{
    public Book()
    { // breakpoint here
    }

    [DataMember(Order = 0)]
    public string Title { get; set; }
    [DataMember(Order = 1)]
    public string Author { get; set; }
    [DataMember(Order = 2)]
    public string Summary { get; set; }
}

जब मैं उस वर्ग की वस्तु को deserialize, तो ब्रेकपॉइंट हिट नहीं है। मुझे बिल्कुल पता नहीं है कि यह कैसे संभव है, क्योंकि यह इस वस्तु के लिए एकमात्र निर्माता है!

मुझे लगता है कि DataContract विशेषता के कारण शायद कंपाइलर द्वारा एक अतिरिक्त कन्स्ट्रक्टर उत्पन्न किया गया था, लेकिन मुझे इसे प्रतिबिंब के माध्यम से नहीं मिला ...

तो, मैं क्या जानना चाहता हूं यह है: कन्स्ट्रक्टर के बिना मेरी कक्षा का एक उदाहरण कैसे बनाया जा सकता है ??

नोट: मुझे पता है कि जब मैं deserialization शुरू होता है मैं अपने ऑब्जेक्ट को प्रारंभ करने के लिए OnDeserializing विशेषता का उपयोग कर सकता हूं, यह मेरे प्रश्न का विषय नहीं है।


कुछ परिदृश्य हैं जो इस व्यवहार के बिना संभव नहीं होंगे। निम्नलिखित के बारे में सोचें:

1) आपके पास एक ऑब्जेक्ट है जिसमें एक कन्स्ट्रक्टर है जो "प्रारंभिक" स्थिति में नया उदाहरण सेट करता है। फिर उस उदाहरण पर कुछ तरीकों को बुलाया जाता है, जो इसे "संसाधित" स्थिति में लाता है। आप "संसाधित" स्थिति वाले नए ऑब्जेक्ट्स नहीं बनाना चाहते हैं, लेकिन आप अभी भी उदाहरण को serialize / deserialize करना चाहते हैं।

2) आपने एक निजी कन्स्ट्रक्टर और कुछ स्थैतिक गुणों के साथ एक वर्ग बनाया है जो कि कन्स्ट्रक्टर पैरामीटर के छोटे सेट को नियंत्रित करने के लिए बनाया गया है। अब आप अभी भी उन्हें क्रमबद्ध / deserialize कर सकते हैं।

XmlSerializer में आपके द्वारा अपेक्षित व्यवहार है। मुझे XmlSerializer के साथ कुछ समस्याएं आई हैं क्योंकि इसे डिफ़ॉल्ट कन्स्ट्रक्टर की आवश्यकता है। इससे संबंधित, कभी-कभी निजी संपत्ति सेटर्स रखने का अर्थ होता है। लेकिन XmlSerializer को serialize / deserialize करने के लिए गुणों पर सार्वजनिक गेटर और सेटटर की भी आवश्यकता है।

मैं DataContractSerializer / BinaryFormatter व्यवहार के बारे में सोचता हूं जैसे क्रमिकरण के दौरान एक उदाहरण की स्थिति को निलंबित करना और deserialization के दौरान फिर से शुरू करना। दूसरे शब्दों में, उदाहरण "निर्मित" नहीं हैं बल्कि पहले के राज्य में "बहाल" किए गए हैं।

जैसा कि आपने पहले ही उल्लेख किया है, [ऑनडिसेरियलाइजिंग] विशेषता गैर-धारावाहिक डेटा को सिंक में रखना संभव बनाता है।


DataContractSerializer (जैसे BinaryFormatter ) किसी भी कन्स्ट्रक्टर का उपयोग नहीं करता है। यह वस्तु को खाली स्मृति के रूप में बनाता है।

उदाहरण के लिए:

    Type type = typeof(Customer);
    object obj = System.Runtime.Serialization.
        FormatterServices.GetUninitializedObject(type);

धारणा यह है कि deserialization प्रक्रिया (या यदि आवश्यक हो तो कॉलबैक) इसे पूरी तरह से शुरू कर देगा।





datacontractserializer