c# क्यों XmlSerializer को[Serializable] चिह्नित करने की आवश्यकता नहीं है?




xml-serialization datacontractserializer (3)

अभी नेट स्टाइल में सीरियललाइज़ेशन के तीन रूप हैं।

  1. XmlSerialization - डिफ़ॉल्ट रूप से सार्वजनिक क्षेत्रों और गुणों पर काम करता है अब भी XmlElementAttribute, XmlAttributeAttribute, आदि द्वारा नियंत्रित किया जा सकता है ...
  2. बाइनरी सिरिअलाइज़ेशन - सीरियलाइज़ेशन विशेषता द्वारा नियंत्रित। सीएलआर में गहराई से एकीकृत
  3. WCF Seralization - DataContractAttribute, आदि ...

दुर्भाग्य से धारावाहिककरण के लिए मानक समग्र पैटर्न है। सभी 3 ढांचे के पास अलग-अलग आवश्यकताओं और quirks है।

सी # में, अगर मैं XmlSerializer साथ एक आवृत्ति को सीरियल करना चाहता हूं, तो वस्तु का प्रकार [Serializable] विशेषता के साथ चिह्नित नहीं होना चाहिए हालांकि, अन्य सीरिजलाइज़ेशन दृष्टिकोणों के लिए, जैसे DataContractSerializer , को क्लास को [Serializable] या [DataContract] के रूप में चिह्नित किया जाना चाहिए।

क्या कोई मानक या क्रमबद्धता आवश्यकता के बारे में पैटर्न है?


सुरक्षा केवल एकमात्र समस्या नहीं है; बस, कुछ वर्गों के लिए धारावाहिककरण केवल समझ में आता है उदाहरण के लिए, यह एक "कनेक्शन" को क्रमबद्ध करने के लिए बहुत छोटा है एक कनेक्शन स्ट्रिंग , निश्चित है, लेकिन कनेक्शन ही? नाह। इसी तरह, जो कुछ भी अप्रबंधित संकेतक / संभाल की आवश्यकता है वह बहुत अच्छी तरह से क्रमबद्ध नहीं होने जा रहा है। न ही प्रतिनिधि हैं

इसके अतिरिक्त, XmlSerializer और DataContractSerializer (डिफ़ॉल्ट रूप से) पेड़ serializers हैं, नहीं ग्राफ serializers - तो किसी भी रिकर्सिव लिंक (जैसे Parent ) इसे तोड़ने के लिए कारण होगा।

धारावाहिक के पसंदीदा टोकन के साथ वर्ग को चिह्नित करना, बस कहने का एक तरीका है "और इसे समझना चाहिए"

IIRC, दोनों [XmlSerializer और [DataContractSerializer] [Serializable] , [DataContract] या [IXmlSerializable] जैसी चीजों की मांग के बारे में बहुत कठोर थे, लेकिन वे हाल ही में थोड़ा अधिक उदार बन गए हैं।


इसका कारण यह है कि XmlSerializer केवल सार्वजनिक क्षेत्रों / गुणों को क्रमबद्ध करता है। सीरियलाइजेशन के अन्य रूप निजी डाटा को सीरियल कर सकते हैं, जो एक संभावित सुरक्षा जोखिम का गठन करता है, इसलिए आपको एक विशेषता का उपयोग करके "ऑप्ट इन" करना होगा





datacontractserializer