2010-11-23 11 views
6

मुझे पता चला है कि एक serializable फील्ड/प्रॉपर्टी प्रकार बूलियन एक नाम के रूप में फील्ड/प्रॉपर्टी "विनिर्दिष्ट" प्रत्यय के साथ नाम होने का एक संगत फ़ील्ड अधिक हो, तो XmlSerializer सशर्त रूप से serialization प्रक्रिया से फ़ील्ड/संपत्ति बाहर निकालें। अच्छा!XmlSerializer, "विनिर्दिष्ट" प्रत्यय और IReflect

तो, मैं उन क्षेत्रों की परिभाषा से बचने, और उन्हें गतिशील रूप से जोड़ने के लिए, क्रम में ...

पढ़ना this करना चाहते हैं, मैं एक दिलचस्प इंटरफ़ेस IReflect, जो मैं "का अनुकरण करने के लिए" डायनामिक फ़ील्ड का उपयोग कर सकते हैं पाया जो कुछ क्षेत्रों को बाहर करने के लिए XmlSerializer उदाहरणों द्वारा उपयोग किया जाता है।

क्या यह काम करेगा?

+0

तुम क्यों आप उन क्षेत्रों से बचना चाहते हैं और रनटाइम पर ऐसा करने पर टिप्पणी कर सकते हैं:

यहाँ एक उदाहरण है? क्या आप कुछ रनटाइम गणना मूल्यों के आधार पर कक्षाओं को अलग-अलग क्रमबद्ध करना चाहते हैं, या आप बस यह अतिरिक्त गुण जोड़ने से बचना चाहते हैं? –

उत्तर

2

यदि आप अपने एक्सएमएल क्रमबद्धरण पर नियंत्रण रखना चाहते हैं तो आपके पास दो विकल्प हैं। पहले (जो यहां उचित नहीं हो सकता है) यह गुणों को बाहर करने के लिए System.Xml.Serialization नामस्थान में विशेषताओं का उपयोग करने के लिए। यदि आपको वास्तव में यह निर्धारित करने की आवश्यकता है कि रनटाइम पर क्रमबद्ध हो जाता है तो यह कार्रवाई का सबसे अच्छा तरीका नहीं हो सकता है।

Attributes That Control XML Serialization

यह करने के लिए अन्य तरीके से अपनी कक्षा पर IXmlSerializable इंटरफ़ेस को लागू और ReadXml और WriteXml तरीकों को लागू करने के लिए है देखें। यह आपको वास्तव में नियंत्रित करने की अनुमति देता है कि आपका एक्सएमएल कैसा दिखता है। अतिरिक्त जानकारी के लिए इस सवाल देखें:

custom xml serialization

हालांकि, यहां Mixing custom and basic serialization? उल्लेख किया है एक बार आप IXmlSerializable लागू आप अपने प्रकार के लिए सभी क्रमबद्धता तर्क लिए जिम्मेदार हैं।

+0

कृपया स्पष्ट रूप से अनुरोध किए जाने तक .NET 1.1 लिंक पोस्ट न करें। –

+0

उत्तर स्वीकार करने के लिए धन्यवाद। वाह! बस एहसास हुआ कि लगभग 1 साल पहले मैंने जवाब दिया :-) –

2

मैं मार्टिन पेक के जवाब का विस्तार होगा। आप "निर्दिष्ट" प्रत्यय वाले फ़ील्ड/गुणों के क्रमिकरण से बच सकते हैं। आपको अपनी कक्षा में "* निर्दिष्ट" गुण परिभाषित करना चाहिए और उन्हें [XmlIgnoreAttribute()] लागू करना चाहिए।

[System.SerializableAttribute()] 
[System.Xml.Serialization.XmlTypeAttribute(Namespace = "http://yournamespace.com")] 
public partial class YourObject 
{ 
    private long sessionTimeoutInSecondsField; 

    private bool sessionTimeoutInSecondsFieldSpecified; 

    public long sessionTimeoutInSeconds 
    { 
     get 
     { 
      return this.sessionTimeoutInSecondsField; 
     } 
     set 
     { 
      this.sessionTimeoutInSecondsField = value; 
     } 
    } 

    [System.Xml.Serialization.XmlIgnoreAttribute()] 
    public bool sessionTimeoutInSecondsSpecified 
    { 
     get 
     { 
      return this.sessionTimeoutInSecondsFieldSpecified; 
     } 
     set 
     { 
      this.sessionTimeoutInSecondsFieldSpecified = value; 
     } 
    } 
} 
+0

आपको '* निर्दिष्ट 'संपत्ति के लिए केवल गेटर का उपयोग मिलता है और' XmlIgnore 'सेट करने की आवश्यकता नहीं है। – xmedeko