2008-09-17 16 views
22

एक्सएमएल स्कीमा भाग 2 निर्दिष्ट करता है कि बूलियन के रूप में परिभाषित डेटाटाइप का एक उदाहरण निम्नलिखित कानूनी अक्षर {सत्य, झूठा, 1, 0} हो सकता है। उदाहरण के लिए, जब वर्णित किया गया है, तो निम्नलिखित XML, बूलियन संपत्ति "अनुकरण" को true पर सेट करता है।एक्सएमएल सीरियलाइज बूलियन 0 और 1

<root> 
    <emulate>1</emulate> 
</root> 

हालांकि, जब मैं वस्तु वापस एक्सएमएल को क्रमानुसार, मैं संख्यात्मक मूल्य के बजाय true मिलता है। मेरा सवाल है, क्या ऐसा कोई तरीका है कि मैं एक्सएमएल में बुलियन प्रतिनिधित्व को नियंत्रित कर सकता हूं?

+0

आप एक्सएमएल क्रमबद्ध करने के लिए जो भी उपयोग कर रहे हैं उसका उल्लेख करना चाहेंगे। –

+1

CoreReview.SE पर एक ही विषय पर एक पूरक [प्रश्न] (http://codereview.stackexchange.com/questions/4829/presenting-a-boolean-as-an-int-for-xmlserialization-in-c) – MPelletier

उत्तर

3

आप IXmlSerializable को कार्यान्वित कर सकते हैं जो आपको अपनी कक्षा के क्रमबद्ध आउटपुट को बदलने की अनुमति देगा। यह 3 विधियों GetSchema(), ReadXml (XmlReader आर) और WriteXml (XmlWriter आर) बनाने के लिए लागू होगा। जब आप इंटरफ़ेस को कार्यान्वित करते हैं, तो इन विधियों को ऑब्जेक्ट को क्रमबद्ध करने की कोशिश कर रहे .NET के बजाय कहा जाता है।

उदाहरण में पाया जा सकता:

[XmlIgnore] 
public bool MyValue { get; set; } 

/// <summary>Get a value purely for serialization purposes</summary> 
[XmlElement("MyValue")] 
public string MyValueSerialize 
{ 
    get { return this.MyValue ? "1" : "0"; } 
    set { this.MyValue = XmlConvert.ToBoolean(value); } 
} 

तुम भी अन्य उपयोग कर सकते हैं:

http://www.developerfusion.co.uk/show/4639/ और

http://msdn.microsoft.com/en-us/library/system.xml.serialization.ixmlserializable.aspx

+1

हाँ, मैं उससे बचने की उम्मीद कर रहा था, लेकिन ऐसा लगता है कि मेरे पास यहां बहुत पसंद नहीं है। धन्यवाद :) –

1

नहीं, डिफ़ॉल्ट सिस्टम का उपयोग नहीं कर रहा है .Xml.XmlSerializer: आपको डेटा प्राप्त करने के लिए एक int में परिवर्तन करने की आवश्यकता होगी, या अपने स्वयं के क्रमिकरण कोड (संभवतः, लेकिन अधिक मजेदार नहीं) प्रदान करने के साथ चारों ओर मिलना होगा।

हालांकि, आप एक्सएसएलटी का उपयोग करके, या बस स्ट्रिंग प्रतिस्थापन का उपयोग कर जेनरेट किए गए एक्सएमएल को पोस्ट-प्रोसेस कर सकते हैं। विकास समय और रन टाइम दोनों में एक हैक, लेकिन बहुत तेज़,

51

तुम भी काला जादू का श्रेय कुछ XmlSerializer का उपयोग करके ऐसा कर सकते हैं यदि आप इससे नाराज हैं तो इस सदस्य को इंटेलिजेंस से छिपाने के गुण! यह एक आदर्श समाधान नहीं है, लेकिन यह IXmlSerializable को लागू करने से तेज़ हो सकता है।

+4

यह भयानक है, लेकिन समस्या हल करता है! मेरे नाश्ते के अल्पकालिक प्रतिधारण को धमकी देने के लिए केवल ऊपर हटाना। –

+0

यह वही है जो मैं खोज रहा था! बहुत बहुत धन्यवाद, मैं नहीं करता कि मैं कभी भी "सत्य" और "झूठी" के रूप में एक्सएमएल में बूलियन मानों को स्टोर नहीं कर पाऊंगा। – Alex

+0

सबसे अच्छा जवाब नहीं: अब आपके पास दो की बजाय दो गुण हैं। मुझे यहां एक बहुत साफ समाधान मिला है: https://stackoverflow.com/questions/5963423/xmlserializer-property-converter#answer-7775097 संक्षेप में, एक नई कक्षा/संरचना बनाएं जो IXmlSerializable लागू करता है। – Fl4v

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