2011-04-29 18 views
13
public class Hat 
{ 
    [XmlTextAttribute] 
    public string Name { get; set; } 
    [XmlAttribute("Color")] 
    public string Color { get; set; } 
} 

var hat1 = new Hat {Name="Cool Hat", Color="Red"}; 
var hat2 = new Hat {Name="Funky Hat", Color=null}; 

यह मैं (नोटिस लापता फंकी टोपी पर रंग-विशेषता) प्राप्त होता हैको क्रमानुसार स्ट्रिंग संपत्ति है, भले ही स्ट्रिंग खाली है

<Hats> 
<Hat Color="Red">Cool Hat</Hat> 
<Hat Color="">Funky Hat</Hat> 
</Hats> 

मैं इसे कैसे बाहर छोड़ने की जगह में एक खाली विशेषता बनाने के लिए serializer मजबूर कर सकते हैं?

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

बाहर कर देता है मैं एक बेवकूफ हूँ और एक उदाहरण है कि एक त्रुटि निहित है, क्योंकि मैं उदाहरण के लिए कोड को आसान बनाने में करना चाहता था बनाया।

यदि रंग का मान "" (string.empty) है, तो इसे वास्तव में खाली विशेषता के रूप में क्रमबद्ध किया जाता है। हालांकि, मैं वास्तव में एक शून्य मूल्य था, एक खाली स्ट्रिंग नहीं - इसलिए इसे छोड़ दिया गया था।

तो मैं जो व्यवहार चाहता था वह वास्तव में पहले से ही मेरे द्वारा बनाए गए उदाहरण का व्यवहार था।

क्षमा करें, लोग!

+0

_ "अगर रंग का मूल्य है" "(या string.empty), यह वास्तव में एक खाली विशेषता के रूप में धारावाहिक है हालांकि, मैं वास्तव में। एक शून्य मूल्य था, एक खाली स्ट्रिंग नहीं - इसलिए इसे छोड़ दिया गया। "_ वाह ने उस व्यवहार को पहले नहीं देखा था। दिलचस्प बिंदु। –

उत्तर

5

कंटेनर के रूप में List<Hat> का उपयोग करने का प्रयास करें। इस का उपयोग करते हुए:

var hats = new List<Hat> 
    { 
     new Hat { Name = "Cool Hat", Color = "Red" }, 
     new Hat { Name = "Funky Hat", Color = string.Empty } 
    }; 

using (var stream = new FileStream("test.txt", FileMode.Truncate)) 
{ 
    var serializer = new XmlSerializer(typeof(List<Hat>)); 
    serializer.Serialize(stream, hats); 
} 

मैं इस:

<?xml version="1.0"?> 
<ArrayOfHat xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Hat Color="Red">Cool Hat</Hat> 
    <Hat Color="">Funky Hat</Hat> 
</ArrayOfHat> 
+1

यह सही रास्ते पर मुझे डाल के रूप में मेरे कंटेनर पहले से ही एक सूची था। – Kjensen

1

आप Specified संपत्ति को सत्य पर सेट करने का प्रयास कर सकते हैं। इसके अलावा, मुझे विश्वास है कि आप क्रमबद्धता को नियंत्रित करने, इस तरह की एक ## निर्दिष्ट प्रॉपर्टी का उपयोग कर सकते हैं:

[XmlAttribute("Color")] 
public string Color { get; set; } 
[XmlIgnore] 
public bool ColorSpecified { get { return true; } } // will always serialize 

या आप जब तक यह रिक्त नहीं है क्रमानुसार कर सकते हैं:

[XmlIgnore] 
public bool ColorSpecified { get { return this.Color != null; } } 
+1

यह काम नहीं प्रतीत होता है। Serialized एक्सएमएल में कुछ भी नहीं बदलता है। बस स्पष्ट होना - यह केवल काम करने के लिए क्योंकि serializer एक bool संपत्ति नामित के लिए लग रहा है माना जाता है [संपत्ति] निर्दिष्ट - इस मामले ColorSpecified में? – Kjensen

+0

@Kjensen: मुझे पता है यह तत्वों के लिए काम करता है (और [संपत्ति] निर्दिष्ट कुछ अंतर्निहित और serializer में हार्ड-कोडेड है - देखना http://msdn.microsoft.com/en-us/library/bb402199(v = exchg.140) .aspx)। यह गुणों के लिए काम नहीं कर सकता है। – mellamokb

1

दो तुम तरीके हैं यह कर सकता है।

आप [XmlElement(IsNullable=true)] का उपयोग कर सकते हैं, जो शून्य मान को पहचानने के लिए मजबूर करेगा।

आप "" के बजाय स्ट्रिंग.एक्टी का भी उपयोग कर सकते हैं। यह एक खाली स्ट्रिंग के रूप में पहचाना जाता है और शून्य नहीं।

+10

'string.Empty ==" "' – Andrey

+0

[XmlElement (Isnullable = true)] केवल तत्वों, नहीं विशेषताओं पर काम करता है। – Kjensen

+0

इसे आज़माएं। यह थोड़ी देर हो गया है, लेकिन मुझे याद है कि यह मेरे लिए पहले काम करता था। String.Empty और "" के बीच छोटा अंतर है। पूर्व वास्तव में एक वस्तु नहीं बना है। –

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