का उपयोग करते हुए खाली xml विशेषता मान को शून्य करने योग्य int गुण में deserializing 0 मुझे तीसरे पक्ष से एक एक्सएमएल मिलता है और मुझे इसे C# ऑब्जेक्ट में deserialize करने की आवश्यकता है। इस एक्सएमएल में पूर्णांक प्रकार या खाली मान के मूल्य वाले गुण हो सकते हैं: attr = "11" या attr = ""। मैं संपत्ति में इस विशेषता मूल्य को निरर्थक पूर्णांक के प्रकार के साथ deserialize करना चाहता हूँ। लेकिन XmlSerializer बेकार प्रकारों में deserialization का समर्थन नहीं करता है। निम्न परीक्षण कोड XmlSerializer के निर्माण के दौरान अमान्यऑपरेशन एक्सेप्शन के साथ विफल रहता है {"टाइप 'TestConsoleAplication.SerializeMe' टाइप करने में त्रुटि हुई।"}।XmlSerializer
[XmlRoot("root")]
public class SerializeMe
{
[XmlElement("element")]
public Element Element { get; set; }
}
public class Element
{
[XmlAttribute("attr")]
public int? Value { get; set; }
}
class Program {
static void Main(string[] args) {
string xml = "<root><element attr=''>valE</element></root>";
var deserializer = new XmlSerializer(typeof(SerializeMe));
Stream xmlStream = new MemoryStream(Encoding.ASCII.GetBytes(xml));
var result = (SerializeMe)deserializer.Deserialize(xmlStream);
}
}
आई इंट को 'मान' संपत्ति का प्रकार बदलते हैं तो अक्रमांकन InvalidOperationException के साथ विफल:
वहाँ XML दस्तावेज़ (1, 16) में कोई त्रुटि है।
क्या कोई सलाह दे सकता है कि खाली मूल्य के साथ विशेषता को शून्य के प्रकार (शून्य के रूप में) में एकजुट करने के लिए एक ही समय में गैर-खाली विशेषता मान को deserializing कैसे करें? क्या इसके लिए कोई चाल है इसलिए मुझे मैन्युअल रूप से प्रत्येक क्षेत्र का deserialization नहीं करना होगा (वास्तव में उनमें से बहुत सारे हैं)? ahsteele से टिप्पणी के बाद
अद्यतन:
-
जहाँ तक मुझे पता है, यह विशेषता केवल XmlElementAttribute साथ काम करता है - यह विशेषता निर्दिष्ट तत्व कोई सामग्री नहीं है कि, कि बच्चे तत्वों या शरीर पाठ। लेकिन मुझे XmlAttributeAttribute के लिए समाधान ढूंढना होगा। वैसे भी मैं एक्सएमएल नहीं बदल सकता क्योंकि मेरे पास इसका कोई नियंत्रण नहीं है।
-
यह गुण काम करता है केवल जब विशेषता मान खाली नहीं है या जब विशेषता अनुपलब्ध है। जब attr में खाली मान होता है (attr = '') XmlSerializer कन्स्ट्रक्टर विफल रहता है (अपेक्षित के रूप में)।
public class Element { [XmlAttribute("attr")] public int Value { get; set; } [XmlIgnore] public bool ValueSpecified; }
Custom Nullable class like in this blog post by Alex Scordellis
मैं मेरी समस्या के लिए इस ब्लॉग पोस्ट से वर्ग को अपनाने की कोशिश की:
[XmlAttribute("attr")] public NullableInt Value { get; set; }
लेकिन XmlSerializer निर्माता InvalidOperationException के साथ विफल:
को क्रमानुसार नहीं कर सकता सदस्य TestConsoleAplplication.NullableInt प्रकार का 'मान'।
XmlAttribute/XmlText (मुझ पर शर्म की बात है कि मैं इस कोड यहाँ लिखा :)) IXmlSerializable को लागू प्रकार}
बदसूरत सरोगेट समाधान एन्कोड करने के लिए नहीं किया जा सकता:
public class Element { [XmlAttribute("attr")] public string SetValue { get; set; } public int? GetValue() { if (string.IsNullOrEmpty(SetValue) || SetValue.Trim().Length <= 0) return null; int result; if (int.TryParse(SetValue, out result)) return result; return null; } }
लेकिन मैं डॉन इस तरह के समाधान के साथ नहीं आना चाहता क्योंकि यह अपने उपभोक्ताओं के लिए मेरी कक्षा के इंटरफ़ेस को तोड़ देता है। मैं मैन्युअल रूप से IXmlSerializable इंटरफेस को मैन्युअल रूप से कार्यान्वित करता हूं।
वर्तमान में यह है कि मैं पूरे तत्व वर्ग के लिए IXmlSerializable लागू करना लग रहा है (यह बड़ा है) और कोई सरल समाधान का ...
"एक Nullable में deserialize करने के लिए XmlSerializer का उपयोग करना" रूपांतरण के साथ-साथ किसी भी संभावित नल प्रविष्टियों का प्रतिनिधित्व करने के लिए लिंक मर चुका है । [यहां Google से एक कैश संस्करण है] (http://webcache.googleusercontent.com/search?q=cache:vT5GiyOCWyIJ:www.rqna.net/qna/zzrzt-deserialise-missing-xml-attribute-to-nullable-type । एचटीएमएल) – Anttu
@ एंटू मैंने मूल * के वेबैक मशीन संग्रह के जवाब में लिंक को स्विच किया है जिसका उपयोग एक्सएमएलएसरियललाइज़र का उपयोग करने के लिए एक नालीबल * में deserialize करने के लिए किया गया है। –
ahsteele