मेरे पास एक ऑब्जेक्ट है जिसे मैं एक्सएमएल में क्रमबद्ध करने की कोशिश कर रहा हूं। इस वस्तु के अंदर एक सामान्य प्रकार (सार वर्ग) की एक सूची है। इस सूची का प्रत्येक आइटम एक अलग वर्ग हो सकता है, लेकिन सभी सार आधार वर्ग से इनहेरिट कर रहे हैं:एक ही प्रकार के नाम के साथ एक पॉलिमॉर्फिक सूची को क्रमबद्ध करें
<animal type="cat">
<size>medium</size>
<furColor>black</furColor>
</animal>
<animal type="fish">
<size>small</size>
<scaleColor>silver</scaleColor>
</animal>
मैं:
public abstract class animal
{
public string type { get; set; }
}
public class cat:animal
{
public string size { get; set; }
public string furColor { get; set; }
}
public class fish:animal
{
public string size { get; set; }
public string scaleColor { get; set; }
}
जब मैं सूची को क्रमानुसार, मैं इसे इस तरह दिखना चाहते हैं मैंने सरल समाधान की कोशिश की है:
[XmlElement("Animal")]
public List<animal> Animals { get; set; }
लेकिन यह एक त्रुटि फेंकता है क्योंकि यह ऑब्जेक्ट प्रकार "बिल्ली" की अपेक्षा नहीं कर रहा है। [XmlInclude] टैग को बेस क्लास, व्युत्पन्न कक्षा, या पूरी युक्त कक्षा में जोड़ें (चलो इसे चिड़ियाघर कहते हैं) इससे मदद नहीं करता है।
मैं एक ही वर्ग के लिए typeof पदनाम का उपयोग कर सकते हैं:
[XmlElement("Animal", typeof(cat))]
public List<animal> Animals { get; set; }
और इस ठीक से काम करता, जैसा कि मैंने, यह करना चाहते हैं जब तक मैं केवल बिल्लियों का उपयोग करें। दोबारा, जिस मिश्रण में मैं मिश्रण में मछली डालता हूं, वह उसी त्रुटि (मछली की अपेक्षा नहीं) के साथ उड़ाता है।
मैं कई typeof जोड़ सकते हैं विशेषताएं:
[XmlElement("Animal")]
[XmlElementAttribute(typeof(cat))]
[XmlElementAttribute(typeof(fish))]
public List<animal> Animals { get; set; }
और इस संकलित, लेकिन तत्व नाम पर ध्यान नहीं देता है, और <cat> </cat>
और <fish> </fish>
, क्रमशः, जो अस्वीकार्य है के रूप में वस्तुओं को धारावाहिक।
मैं यहां तक कि कई [XmlElement] टैग जोड़ने की कोशिश की है:
[XmlElement("Animal", typeof(cat))]
[XmlElement("Animal", typeof(fish))]
public List<animal> Animals { get; set; }
इसे कोई दूसरा अपवाद, इस बार है कि वस्तुओं "बिल्ली" और "मछली" दोनों में टाइप करें "पशु" का उपयोग फेंकता वही दायरा
क्या कोई इस बारे में सोच सकता है?
अद्यतन थोड़ा और अधिक खुदाई बाद, मैंने पाया This SO post जो आधार वर्ग के लिए नाम स्थान जोड़ने का सुझाव:
[XmlRoot(Namespace="myNamespace")]
[XmlInclude(typeof(cat))]
[XmlInclude(typeof(fish))]
public abstract class animal
इस Serializing निम्नलिखित पैदावार:
<animal xsi:type="cat" type="cat">
...
</animal>
<animal xsi:type="fish" type="fish">
...
</animal>
कहाँ xsi: टाइप = "बिल्ली" कक्षा के नाम को संदर्भित करता है, और प्रकार = "बिल्ली" उस प्रकार की विशेषता विशेषता को संदर्भित करता है बेस क्लास के भीतर (बहुत ही शीर्ष उदाहरण देखें)। यह है जो मुझे चाहिए को बंद करें, और मुझे डर है कि मैं यहां अनुभवहीनता से पीड़ित हो सकता हूं, लेकिन क्या xsi से छुटकारा पाने का कोई तरीका है: विशेषता विशेषता सूची?
मैंने आपका शीर्षक संपादित किया है। कृपया देखें, "[प्रश्नों में उनके शीर्षक में" टैग "शामिल होना चाहिए?] (Http://meta.stackexchange.com/questions/19190/)", जहां आम सहमति है "नहीं, उन्हें नहीं करना चाहिए"। –
क्षमा करें, मैंने दिशानिर्देशों में उस बिट को याद किया। सर उठाने के लिए धन्यवाद। – JesseF
एक आंशिक समाधान मिला, विवरण के लिए नीचे दिए गए अद्यतन को देखें – JesseF