2009-02-26 13 views
10

मैं किसी संपत्ति के क्रमबद्ध व्यवहार को बदलने का तरीका ढूंढने का प्रयास कर रहा हूं।किसी विशेषता के साथ संपत्ति को ओवरराइड करना

चलें कहते हैं कि मैं इस तरह एक स्थिति है:

[Serializable] 
public class Record 
{ 
    public DateTime LastUpdated {get; set; } 

    // other useful properties ... 
} 

public class EmployeeRecord : Record 
{ 
    public string EmployeeName {get; set; } 

    // other useful properties ... 
} 

अब मैं EmployeeRecord क्रमानुसार करने चाहते हैं। मैं रिकॉर्ड क्लास से अंतिम अद्यतन संपत्ति को क्रमबद्ध नहीं करना चाहता हूं। (जब मैं रिकॉर्ड को क्रमबद्ध करता हूं, तो मैं अंतिम अद्यतन को क्रमबद्ध करना चाहता हूं)।

सबसे पहले मैं नई कीवर्ड का उपयोग करें और फिर जोड़ने XmlIgnore विशेषता के आधार पर LastUpdated संपत्ति छुपा की कोशिश की:

public class EmployeeRecord : Record 
{ 
    public string EmployeeName {get; set; } 

    [XmlIgnore] 
    public new DateTime LastUpdated {get; set; } 
    // other useful properties ... 
} 

लेकिन वह काम नहीं किया। तब मैं बनाने आधार आभासी LastUpdated और यह अधिभावी, विशेषता रखने की कोशिश की:

[Serializable] 
public class Record 
{ 
    public virtual DateTime LastUpdated {get; set; } 

    // other useful properties ... 
} 

public class EmployeeRecord : Record 
{ 
    public string EmployeeName {get; set; } 

    [XmlIgnore] 
    public override DateTime LastUpdated {get; set; } 
    // other useful properties ... 
} 

यह या तो काम नहीं किया। दोनों प्रयासों में LastUpdated XmlIgnore विशेषता को अनदेखा कर दिया और खुशी से serializing के अपने व्यापार के बारे में चला गया।

क्या ऐसा करने का कोई तरीका है जो मैं करने की कोशिश कर रहा हूं?

+0

आप इसे कैसे क्रमबद्ध कर रहे हैं? क्योंकि यदि आप बाइनरी क्रमिकरण का उपयोग करते हैं, तो XmlIgnore विशेषता बहुत अच्छी नहीं होगी। –

+0

मैं XmlSerializer –

+0

का उपयोग कर रहा हूं आप बाइनरी क्रमबद्धता के लिए NonSerialized विशेषता का उपयोग करेंगे। – snarf

उत्तर

17

सबसे पहले, [Serializable] attr के पास XmlSerializer के साथ कुछ लेना देना नहीं है। वह एक लाल हेरिंग है। [Serializable] System.Runtime.Serialization के लिए सार्थक है, जबकि XmlSerializer System.Xml.Serialization में रहता है। यदि आप अपनी कक्षा [Serializable] और [XmlIgnore] के साथ अपने सदस्यों को सजा रहे हैं तो आप शायद अपने कोड या अपने कोड के अन्य पाठकों को भ्रमित कर रहे हैं।

.NET में XmlSerialization बहुत लचीला है। सीरियलाइजेशन कैसे किया जा रहा है, इस पर निर्भर करता है कि सीधे आप या परोक्ष रूप से, वेब सेवा रनटाइम द्वारा कहें - आपके पास चीजों को नियंत्रित करने के विभिन्न तरीके हैं।

एक विकल्प संपत्ति नाम एक्सएमएल सीरियलाइजेशन में संपत्ति को चालू या बंद करने के लिए निर्दिष्ट पैटर्न का उपयोग करना है। मान लीजिए आप इस कोड है:

public class TypeA 
{ 
    public DateTime LastModified; 
    [XmlIgnore] 
    public bool LastModifiedSpecified; 
} 

तो फिर, अगर LastModifiedSpecified एक उदाहरण में गलत है, LastModified क्षेत्र है कि उदाहरण के लिए धारावाहिक नहीं किया जाएगा। अपने प्रकार के कन्स्ट्रक्टर में, आप अंतिम प्रकार में हमेशा सत्य होने के लिए LastModifiedSpecified सेट कर सकते हैं, और हमेशा व्युत्पन्न प्रकार में गलत हो सकते हैं। वास्तविक बूलियन - LastModifiedSpecified - serialized कभी नहीं मिलता है क्योंकि यह XmlIgnore चिह्नित है।

यह छोटी सी चाल here दस्तावेज है।

आपका दूसरा विकल्प XmlAttributeOverrides, जो गतिशील एक्सएमएल क्रमबद्धता विशेषताओं का सेट उपलब्ध कराने का एक तरीका है (XmlElementAttribute, XmlIgnoreAttribute, XmlRootAttribute, जैसे और इतने पर ...) उपयोग करने के लिए है - गतिशील रूप से रनटाइम पर serializer उन विशेषताओं को उपलब्ध कराने के । XmlSerializer, उन विशेषताओं के लिए स्वयं का निरीक्षण करने के बजाय, केवल अपने कन्स्ट्रक्टर को प्रदान किए गए ओवरराइड विशेषताओं की सूची के माध्यम से चलता है।

var overrides = new XmlAttributeOverrides(); 
    // ....fill the overrides here.... 
    // create a new instance of the serializer specifying overrides 
    var s1 = new XmlSerializer(typeof(Foo), overrides); 
    // serialize as normal, here. 

यह अधिक जानकारी here में दिखाया गया है।

अपने मामले में, आप XmlIgnoreAttribute को ओवरराइड के रूप में प्रदान करेंगे, लेकिन केवल व्युत्पन्न प्रकार को क्रमबद्ध करते समय।(या जो कुछ भी) यह केवल तब काम करता है जब आप सीधे XmlSerializer को तुरंत चालू करते हैं - यह तब काम नहीं करेगा जब serialization को रनटाइम द्वारा पूरी तरह से किया जाता है, जैसे वेब सेवाओं के साथ।

चीयर्स!

+0

वाह, मैंने पहले कभी निर्दिष्ट पैटर्न के बारे में कभी नहीं सुना होगा। एक जादू की तरह काम किया! –

8
सबसे अच्छा मैं के बारे में सोच सकते हैं

...

[Serializable] 
public class Record 
{ 
    public DateTime LastUpdated {get; set; } 
    public virtual bool ShouldSerializeLastUpdated() {return true;} 
    // other useful properties ... 
} 

public class EmployeeRecord : Record 
{ 
    public string EmployeeName {get; set; } 
    public override bool ShouldSerializeLastUpdated() {return false;} 
    // other useful properties ... 
} 

मूल रूप से, वहाँ कुछ पैटर्न है कि XmlSerializer सम्मान कर रहे हैं; public bool ShouldSerialize*(), और public bool *Specified {get;set;} (ध्यान दें कि आपको *Specified[XmlIgnore] के साथ भी चिह्नित करना चाहिए ...)।

बहुत सुरुचिपूर्ण नहीं, मैं प्रदान करूंगा; लेकिन XmlSerializer केवल सार्वजनिक सदस्यों को देखता है, इसलिए आप उन्हें छुपा भी नहीं सकते ([EditorBrowsable(EditorBrowsableState.Never), Browsable(false)] से कम)।

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