2010-07-14 15 views
21

मेरे पास कई नलबल < टी > गुणों वाला एक वर्ग है जो मैं एक्सएमएल को गुणों के रूप में क्रमबद्ध करना चाहता हूं। यह स्पष्ट रूप से नो-नो है क्योंकि उन्हें 'जटिल प्रकार' माना जाता है। तो, बजाय मैं * निर्धारित पैटर्न, जहां मैं एक अतिरिक्त बनाने के लागू * मूल्य और * यह विशेषता इस प्रकार है:XmlSerializer और nullable विशेषताएँ

 
[XmlIgnore] 
public int? Age 
{ 
    get { return this.age; } 
    set { this.age = value; } 
} 

[XmlAttribute("Age")] 
public int AgeValue 
{ 
    get { return this.age.Value; } 
    set { this.age = value; } 
} 

[XmlIgnore] 
public bool AgeValueSpecified 
{ 
    get { return this.age.HasValue; } 
} 

कौन सा ठीक काम करता है - अगर 'उम्र' संपत्ति एक मूल्य है, यह एक के रूप में धारावाहिक रूप है विशेषता। यदि इसका कोई मूल्य नहीं है, तो यह क्रमबद्ध नहीं है।

समस्या यह है कि, जैसा कि मैंने उल्लेख किया है, मेरे वर्ग में बहुत सारे नामुमकिन हैं और यह पैटर्न सिर्फ चीजों को गन्दा और अप्रबंधनीय बना रहा है।

मैं आशा करती हूं Nullable अधिक XmlSerializer के अनुकूल बनाने के लिए एक रास्ता है। या, उसमें असफल, एक नालीबल प्रतिस्थापन बनाने का एक तरीका है जो है।

क्या किसी के पास कोई विचार है कि मैं यह कैसे कर सकता हूं?

धन्यवाद।

उत्तर

8

अपनी कक्षा पर IXmlSerializable इंटरफेस को लागू करें। इसके बाद आप ReadXML और WriteXML विधियों में नलिकाओं जैसे विशेष मामलों को संभाल सकते हैं। ।


class YourClass : IXmlSerializable 
{ 
    public int? Age 
    { 
     get { return this.age; } 
     set { this.age = value; } 
    } 

    //OTHER CLASS STUFF// 

    #region IXmlSerializable members 
    public void WriteXml (XmlWriter writer) 
    { 
     if(Age != null) 
     { 
      writer.WriteValue(Age) 
     } 
    } 

    public void ReadXml (XmlReader reader) 
    { 
     Age = reader.ReadValue(); 
    } 

    public XmlSchema GetSchema() 
    { 
     return(null); 
    } 
    #endregion 
} 
+0

मुझे लगता है कि ऐसा करना होगा - यह एक विशेषता के रूप में क्रमबद्ध करने के लिए 'जटिल' प्रकार बताने में सक्षम होना अच्छा होगा। – Barg

9

मैं कुछ कोड मैं पर काम कर रहा था के साथ एक समान समस्या थी, और मैं सिर्फ संपत्ति मैं serializing किया गया था और deserializing के लिए एक स्ट्रिंग का उपयोग करने का फैसला किया। मैं इस तरह कुछ खत्म हो गया:

[XmlAttribute("Age")] 
public string Age 
{ 
    get 
    { 
     if (this.age.HasValue) 
      return this.age.Value.ToString(); 
     else 
      return null; 
    } 
    set 
    { 
     if (value != null) 
      this.age = int.Parse(value); 
     else 
      this.age = null; 
    } 
} 

[XmlIgnore] 
public int? age;