Tuesday 15 September 2015

.net - Problems with DataContractSerializer - how to correctly serialize objects deriving from List<T>? -


निम्न नमूना कोड का निरीक्षण करें:

  नाम स्थान एक {[सीरियलज़ेबल] आंतरिक वर्ग परिसर ऑब्जेक्ट & lt; टी & gt; : सूची & lt; T & gt ;, आईक्वेटेबल & lt; कॉम्प्लेक्स ऑब्जेक्ट & lt; T & gt; & gt; जहां टी: आईएक्वेटेबल & lt; T & gt; {निजी टी एम_स्टेट; आंतरिक टी राज्य {get {return m_state; } सेट {m_state = value; }} पब्लिक बॉल्स इक्वाल (कॉम्प्लेक्स ऑब्जेक्ट & lt; T & gt; अन्य) {// कार्यान्वयन अंतरिक्ष को बचाने के लिए छोड़े गए हैं }} सार्वजनिक स्थिर वर्ग कार्यक्रम {सार्वजनिक स्थिर शून्य मुख्य () {var obj = नया कॉम्प्लेक्स ऑब्जेक्ट & lt; int & gt; (); Obj.state = 100; Var स्ट्रीम = नया मेमोरीस्ट्रीम (); Var सीरियलाइजर = नया डेटा कंट्रेक्टसिरियालाइजर (obj.GetType ()); Serializer.WriteObject (स्ट्रीम, ओबीजी); stream.Flush (); स्ट्रीम। खोजें (0, SeekOrigin.Begin); Var copy = (कॉम्प्लेक्स ऑब्जेक्ट & lt; int & gt;) serializer.ReadObject (स्ट्रीम); Debug.Assert (obj.Equals (कॉपी)); }}}  

ध्यान दें कि जटिल ऑब्जेक्ट & lt; T & gt; से सूची T & gt; से निकला है।

फिर भी, आखिरी दावा विफल हो जाता है [सीरियलिज़ेबल] के साथ [CollectionDataContract] को बदलकर और [DataMember] से m_state के समान नकारात्मक परिणाम प्राप्त कर सकते हैं। < / P>

ऐसा लगता है कि DataContractSerializer नोटिस करता है कि वर्ग एक संग्रह है और इसके अन्य राज्य को अनदेखा करने का विकल्प चुनता है।

कृपया इस समस्या को हल करने के लिए किसी को भी सलाह दें

  • मैं कॉम्प्लेक्स ऑब्जेक्ट & lt; T & gt; के रूप में संभव के रूप में कुछ परिवर्तन करना चाहूंगा
  • मैं DataContractSerializer < />> इस प्रश्न के लिए अप्रासंगिक कारणों के लिए

    बहुत पहले धन्यवाद।

    संपादित करें:

     < कोड> सार्वजनिक बूल बराबर (कॉम्प्लेक्स ऑब्जेक्ट & lt; T & gt; अन्य) {if (! M_state.Equals (अन्य। एम_स्टेट)} गिनती = अन्य। संख्या) {वापसी झूठी; } Bool परिणाम = सच; के लिए (इंट आई = 0; आई & lt; गणना & amp; amp; amp; (परिणाम = यह [i]। एक्वायल्स (अन्य [i])); ++ i) {} रिटर्न परिणाम; }  

एक सूची संरचना को सही क्रमबद्ध करने के लिए, आपको CollectionDataContract विशेषता इस प्रकार है:

  [संग्रहडाटा कॉन्ट्रैक्ट] [सीरियलज़ेबल] आंतरिक वर्ग परिसर ऑब्जेक्ट & lt; T & gt; : सूची & lt; T & gt ;, आईक्वेटेबल & lt; कॉम्प्लेक्स ऑब्जेक्ट & lt; T & gt; & gt; जहां टी: आईएक्वेटेबल & lt; T & gt;  

हालांकि, संग्रहडाटाकंट्रैक्ट अतिरिक्त डेटामैम्बर्स को सीरियललाइज करने की अनुमति नहीं देता है। कार्यवाही सूची से इनहेरिटिंग से बचने के लिए होगी, लेकिन इसके बजाय इसे एक सदस्य चर बनाकर और वैकल्पिक रूप से आईसीओल्यूशन को लागू करना होगा, जैसे: <डेटा प्रदाता> [सीरियलिज़ेबल] आंतरिक श्रेणी के कॉम्प्लेक्सऑब्जेक्ट & lt; T & gt; : आईकॉल्लेक्शन & lt; T & gt ;, आईक्वेटेबल & lt; कॉम्प्लेक्स ऑब्जेक्ट & lt; T & gt; & gt; जहां टी: आईएक्वेटेबल & lt; T & gt; {निजी टी एम_स्टेट; [डेटामेम्बर] सार्वजनिक टी राज्य {get {return m_state; } सेट {m_state = value; }} निजी सूची & lt; T & gt; एम_लिस्ट = नई सूची & lt; T & gt; (); [डेटामेम्बर] सार्वजनिक सूची & lt; T & gt; सूची {वापस {return m_List; } सेट {m_List = value; }} सार्वजनिक बाल बराबर (कॉम्प्लेक्स ऑब्जेक्ट & lt; T & gt; अन्य) {यदि (! अन्य। राज्य। एक्लॉल्स् (राज्य)) गलत लौटा; अगर (अन्य। सूची! गणना! = सूची.काउंट) झूठी वापसी; के लिए (इंट आई = 0; आई & lt; अन्य.लिस्ट.काउंट; i ++) {if (! अन्य। सूची [i]। एक्लॉल्स (लिस्ट [i])) लौट आई; } वापस सच; } // आईकॉल्किंग के सदस्यों को रिक्त करने के काम की रकम / कम करने के लिए सूची के चारों ओर लपेटने के लिए स्थान / सहायक विधियों को बचाने के लिए बाहर छोड़ा गया था, आपको सार्वजनिक शून्य जोड़ें (टी आइटम) करना होगा {List.Add (item); } सार्वजनिक बाल निकालें (टी आइटम) {वापसी सूची। निकालें (आइटम); } सार्वजनिक टी इस [int index] {get {return list [index]; }}}

पर क्लिक करें

No comments:

Post a Comment