2012-02-12 17 views
6

के साथ धारावाहिक वस्तुओं की जेनेरिक सूची क्रमबद्ध करें सार आधार वर्ग के साथ सामान्य वस्तुओं की सूची को क्रमबद्ध करने के तरीके पर कोई अच्छा नमूना। गैर सार आधार वर्ग वाले नमूने XML Serialize generic list of serializable objects में सूचीबद्ध हैं। मेरा बेस क्लास Microsoft.Build.Utilities.Taskएक्सएमएल सारणी बेस क्लास

+0

@Dmitry के साथ सहमत हैं। वैकल्पिक उत्तर XmlInclude के बिना serializing में पाया जा सकता है http://stackoverflow.com/questions/370291/serializing-without-xmlinclude – walter

उत्तर

4

के समान है, यह अक्सर कई व्युत्पन्न प्रकारों के साथ सार कक्षाओं के लिए उपयोगी होता है ताकि दृढ़ता से टाइप की गई सूचियों और इस तरह के उपयोग की अनुमति मिल सके।

उदाहरण के लिए आपके पास एक दस्तावेज़फ्रेगमेंट क्लास हो सकती है जो सारणी और दो ठोस वर्गों को टेक्स्ट डॉक्यूमेंटफ्रैगमेंट और कमेंट डॉक्यूमेंट फ्रैगमेंट (विलिस से यह उदाहरण) कहा जाता है।

यह एक सूची संपत्ति के निर्माण की अनुमति देता है जिसमें केवल दो प्रकार के ऑब्जेक्ट्स हो सकते हैं।

आप एक WebService कि इस सूची आपको कोई त्रुटि मिलती रिटर्न बनाने का प्रयास है, लेकिन इस नीचे दिए गए कोड के साथ चारों ओर पाने के लिए आसान है ....

[Serializable()] 
[System.Xml.Serialization.XmlInclude(typeof(TextDocumentFragment))] 
[System.Xml.Serialization.XmlInclude(typeof(CommentDocumentFragment))] 
public abstract class DocumentFragment { 
...} 

XmlInclude गुण वर्ग बताओ कि यह हो सकता है उन दो व्युत्पन्न कक्षाओं में क्रमबद्ध किया जाना चाहिए।

यह वास्तविक प्रकार को निर्दिष्ट करने वाले दस्तावेज़ प्रकार तत्व में एक विशेषता उत्पन्न करता है, जैसा कि नीचे दिया गया है।

<DocumentFragment xsi:type="TextDocumentFragment"> 

व्युत्पन्न कक्षा के लिए विशिष्ट कोई भी अतिरिक्त गुण भी इस विधि का उपयोग करके शामिल किया जाएगा।

11

एक अन्य विकल्प सामान्य सूची ही के लिए जाना जाता प्रकारों की सूची ले जाने के लिए उपयोग करने के लिए XmlElementAttribute

using System; 
using System.Xml; 
using System.Xml.Serialization; 
using System.Collections.Generic; 

public abstract class Animal 
{ 
    public int Weight { get; set; }  
} 

public class Cat : Animal 
{ 
    public int FurLength { get; set; }  
} 

public class Fish : Animal 
{ 
    public int ScalesCount { get; set; }  
} 

public class AnimalFarm 
{ 
    [XmlElement(typeof(Cat))] 
    [XmlElement(typeof(Fish))] 
    public List<Animal> Animals { get; set; } 

    public AnimalFarm() 
    { 
     Animals = new List<Animal>(); 
    } 
} 

public class Program 
{ 
    public static void Main() 
    { 
     AnimalFarm animalFarm = new AnimalFarm(); 
     animalFarm.Animals.Add(new Cat() { Weight = 4000, FurLength = 3 }); 
     animalFarm.Animals.Add(new Fish() { Weight = 200, ScalesCount = 99 }); 
     XmlSerializer serializer = new XmlSerializer(typeof(AnimalFarm)); 
     serializer.Serialize(Console.Out, animalFarm); 
    } 
} 

... जो भी एक बेहतर लग रही XML आउटपुट में परिणाम होगा (बदसूरत बिना है ... xsi:type विशेषता) ...

<?xml version="1.0" encoding="ibm850"?> 
<AnimalFarm xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Cat> 
    <Weight>4000</Weight> 
    <FurLength>3</FurLength> 
    </Cat> 
    <Fish> 
    <Weight>200</Weight> 
    <ScalesCount>99</ScalesCount> 
    </Fish> 
</AnimalFarm> 
+0

यदि आप पशु तत्व को रखना नहीं चाहते हैं तो आप इसके बजाय XmlArrayItemAttribute का उपयोग कर सकते हैं। – Console

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