2010-02-18 18 views
29

मैं एक वर्ग PersonListXmlSerializer सूची आइटम तत्व नाम

[XmlRoot("Persons")] 
PersonList : List<Human> 

जब मैं एक्सएमएल को यह क्रमानुसार है, डिफ़ॉल्ट रूप से यह कुछ इस तरह का उत्पादन करेगा:

<Persons> 
    <Human>...</Human> 
    <Human>...</Human> 
</Persons> 

मेरा प्रश्न क्या करने की जरूरत है है आउटपुट में Human से Person तत्व बदलने के लिए किया गया? इसलिए उत्पादन होगा:

<Persons> 
    <Person>...</Person> 
    <Person>...</Person> 
</Persons> 

और, कैसे PersonList वर्ग वस्तु को ऊपर एक्सएमएल deserialize के लिए?

[XmlRoot("Persons")] 
public class Persons : List<Human> 
{ 

} 

[XmlRoot("Person")] 
public class Human 
{ 
    public Human() 
    { 
    } 

    public Human(string name) 
    { 
     Name = name; 
    } 

    [XmlElement("Name")] 
    public string Name { get; set; } 

} 

void TestXmlSerialize() 
{ 
    Persons personList = new Persons(); 
    personList.Add(new Human("John")); 
    personList.Add(new Human("Peter")); 

    try 
    { 
     using (StringWriter writer = new StringWriter()) 
     { 
      XmlSerializer serializer = new XmlSerializer(typeof(Persons)); 
      XmlWriterSettings settings = new XmlWriterSettings(); 
      settings.OmitXmlDeclaration = true; 

      XmlSerializerNamespaces namespaces = new XmlSerializerNamespaces(); 
      namespaces.Add(string.Empty, string.Empty); 

      XmlWriter xmlWriter = XmlWriter.Create(writer, settings); 
      serializer.Serialize(xmlWriter, personList, namespaces); 

      Console.Out.WriteLine(writer.ToString()); 
     } 
    } 
    catch (Exception e) 
    { 
     Console.Out.WriteLine(e.ToString()); 
    } 
} 

परीक्षण कोड के उत्पादन में है:

<Persons> 
    <Human> 
    <Name>John</Name> 
    </Human> 
    <Human> 
    <Name>Peter</Name> 
    </Human> 
</Persons> 

उत्पादन पता चलता है, Human पर [XmlRoot("Person")] टैग नहीं बदलता है

प्रति निक सलाह, यहाँ मेरी परीक्षण कोड है से Human पर।

+0

tribe84 सही जवाब पोस्ट ... – lanicor

+0

मेरे मुद्दा तो यहाँ मेरी समाधान (यदि आप आश्चर्य है टिप्पणी में फ्रेंच कर रहे हैं) है यह था कि सरणी को आंतरिक – Nick

उत्तर

22

मुझे नहीं लगता कि जेनरेट किए गए सरणी तत्वों के नाम को नियंत्रित करने का कोई तरीका है।

यदि आप किसी अन्य कक्षा के अंदर Persons संग्रह को लपेट सकते हैं तो आपके पास XmlArrayAttribute और XmlArrayItemAttribute का उपयोग करके उत्पन्न आउटपुट पर पूर्ण नियंत्रण होगा।

यदि आप इस नई कक्षा को नहीं बना सकते हैं तो आप IXmlSerializable को लागू करने का सहारा ले सकते हैं, लेकिन यह अधिक जटिल है।

पहले विकल्प के लिए एक उदाहरण इस प्रकार है:

[XmlRoot("Context")] 
public class Context 
{ 
    public Context() { this.Persons = new Persons(); } 

    [XmlArray("Persons")] 
    [XmlArrayItem("Person")] 
    public Persons Persons { get; set; } 
} 

public class Persons : List<Human> { } 

public class Human 
{ 
    public Human() { } 
    public Human(string name) { Name = name; } 
    public string Name { get; set; } 
} 

class Program 
{ 
    public static void Main(string[] args) 
    { 
     Context ctx = new Context(); 
     ctx.Persons.Add(new Human("john")); 
     ctx.Persons.Add(new Human("jane")); 

     var writer = new StringWriter(); 
     new XmlSerializer(typeof(Context)).Serialize(writer, ctx); 

     Console.WriteLine(writer.ToString()); 
    } 
} 
+0

जोआओ यह सही है, अगर आप उन XML विशेषताओं का उपयोग करना चाहते हैं जिन्हें आपको अपने सरणी को रूट करने की आवश्यकता है। –

+0

एक संदर्भ वर्ग के बिना समाधान के लिए (जिसका उपयोग मेरे लिए प्रश्न से बाहर था) नीचे देखें @ जनजाति 84 उत्तर [http://stackoverflow.com/a/7812831/386546 ](http://stackoverflow.com/a/ 7812831/386546) –

3

सेट मानव पर XmlRoot रहे हैं:

[XmlRoot("Person")] 

साइडबार:

व्यक्तियों शायद लोग

+4

चिह्नित किया गया था, यह मानव वर्ग को सीधे क्रमबद्ध करने पर काम करता है, और व्यक्ति वर्ग को क्रमबद्ध करते समय बाल आइटम के रूप में काम नहीं करता है। – Qstonr

1

होना चाहिए आप के लिए स्रोत के लिए उपयोग नहीं है, तो मानव वर्ग (इस मामले में, XmlRoot सेटिंग संभव नहीं है), आप XmlElementAttribute बना सकते हैं, फिर इसे XmlAttributeOverride में जोड़ें और अपने XmlSerializer का उदाहरण बनाते समय इसका उपयोग करें। See this MSDN article for more details

+0

@ निक: +1: वैकल्पिक विकल्प प्रदान करने के लिए जब उसे 'मानव' तक पहुंच नहीं है, तो उसे नहीं माना गया था। एक और, थोड़ा कम शामिल, इस मामले के लिए समाधान एक नई कक्षा में आधार के रूप में मानव (माना जाता है) का उपयोग करना होगा और वहां XmlRoot सेट करना होगा। यह हैकिश है लेकिन ... :-) –

+0

धन्यवाद, लेकिन मैं इसे काम नहीं कर सकता। मुझे आश्चर्य है क्योंकि ऐसा इसलिए है क्योंकि मैं किसी ऑब्जेक्ट के किसी सदस्य को ओवरराइड करने के बजाय, सामान्य सूची में आइटम्स के तत्व तत्व को ओवरराइड करने का प्रयास कर रहा हूं। – Qstonr

+1

@Qstonr - मैं उस कोड के साथ प्रश्न को अपडेट करने का सुझाव दूंगा जिसे आपने काम करने की कोशिश की थी। समीक्षा के बिना कोड के बिना समस्या निवारण करना वाकई मुश्किल है। – Nick

12

मैं अपने serializer के साथ समान समस्या थी। ऊपर दिए गए उत्तरों में से कोई भी बिल्कुल काम नहीं करता है। मैंने पाया कि मानव वर्ग पर XmlRoot विशेषता को स्पष्ट रूप से अनदेखा किया गया है क्योंकि यह दस्तावेज़ का मूल तत्व नहीं है। किसी संदर्भ ऑब्जेक्ट में सूची को लपेटना मेरे लिए एक विकल्प नहीं था क्योंकि मैं एक्सएमएल स्कीमा नहीं बदल सकता। समाधान व्यक्ति वर्ग को बदलने के लिए है। एक सामान्य सूची को उप-वर्गीकृत करने के बजाय, आप इसे किसी ऑब्जेक्ट में लपेटते हैं और इसे क्रमबद्ध करने के तरीके को बदलते हैं।नीचे नमूना कोड देखें:

[XmlRoot("Persons")] 
public class Persons 
{ 
    public Persons() 
    { 
     People = new List<Human>(); 
    } 

    [XmlElement("Person")] 
    public List<Human> People 
    { get; set; } 
} 

public class Human 
{ 
    public Human() 
    { 
    } 

    public Human(string name) 
    { 
     Name = name; 
    } 

    [XmlElement("Name")] 
    public string Name { get; set; } 
} 

XmlElement का उपयोग कर अपने सामान्य सूची Serializing है कि यह अपनी सूची के आसपास आवरण तत्व नहीं रखेंगे XmlArray करता है या उपवर्गीकरण की तरह की तरह होता है।

How do I add a attribute to a XmlArray element (XML Serialization)?

49

मार्क निम्नलिखित विशेषताओं के साथ अपने वर्ग:

[XmlType("Account")] 
[XmlRoot("Account")] 
+11

मुझे केवल पहला आवश्यक पाया गया, धन्यवाद :) – Jeff

+6

यह सही उत्तर है। अन्य उत्तर सिर्फ कामकाज हैं, जबकि यह वास्तविक समाधान है! – Rhyous

4

यह वह जगह है यह भी आप व्यक्तियों वर्ग के लिए विशेषताएं जोड़ना का बोनस विकल्प है, जो मैं कहाँ से विचार आया देता है मेरा परीक्षण कोड

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

namespace TestLoadingMultiXml 
{ 
[XmlRoot([email protected]"main")] 
public class XmlMain 
{ 
    private XmlDataTest data; 

    [XmlElement([email protected]"datalist")] 
    public XmlDataTest Data 
    { 
     get { return data; } 
     set { data = value; } 
    } // public XmlDataTest Data 

    public XmlMain() 
    { 
     data = new XmlDataTest(); 
    } 
} 

[XmlRoot([email protected]"xmldata")] 
public class XmlDataTest 
{ 
    private List<DataDetails> listData; 

    [XmlElement([email protected]"listdata")] 
    public List<DataDetails> Data 
    { 
     get { return listData; } 
     set { listData = value; } 
    } 

    public XmlDataTest() 
    { 
     listData = new List<DataDetails>(); 
     for (int i = 0; i < 10; i++) 
     { 
      DataDetails d = new DataDetails(string.Format("{0}", i)); 
      listData.Add(d); 
     } // for (int i=0; i < 10; i++) 
    } // public XmlDataTest() 
} // class XmlDataTest 

[XmlRoot([email protected]"datadetail")] 
public class DataDetails 
{ 
    private string name; 

    [XmlAttribute([email protected]"name")] 
    public string Name 
    { 
     get 
     { 
      return name; 
     } 
     set { name = value; } 
    } 

    public DataDetails(string _value) 
    { 
     this.name = _value; 
    } // public DataDetails(string _value) 

    public DataDetails() 
    { 
     this.name = ""; 
    } // public DataDetails() 
} // public class DataDetails 
} 

और चल रहा कार्यक्रम

using System; 
using System.IO; 
using System.Windows.Forms; 
using System.Xml.Serialization; 

namespace TestLoadingMultiXml 
{ 
    public partial class Form1 : Form 
    { 
    private XmlMain xt; 
    private string xname = @"x.xml"; 

    public Form1() 
    { 
     InitializeComponent(); 
     this.FormClosing += new FormClosingEventHandler(Form1_FormClosing); 
    } 

    void Form1_FormClosing(object sender, FormClosingEventArgs e) 
    { 
     XmlSerializer x = new XmlSerializer(typeof(XmlMain)); 
     FileStream fs = new FileStream(xname, FileMode.Create); 
     x.Serialize(fs, xt); 
     fs.Close(); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     xt = new XmlMain(); 
     xname = Directory.GetCurrentDirectory() + @"\" + xname; 
     if (File.Exists(xname)) 
     { 
      XmlSerializer x = new XmlSerializer(typeof(XmlMain)); 
      FileStream fs = new FileStream(xname, FileMode.Open); 
      xt = (XmlMain)x.Deserialize(fs); 
      fs.Close(); 
     } // if (File.Exists(xname)) 
    } 
} 
} 

इसके अलावा इस परिणाम

<?xml version="1.0"?> 
<main xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <datalist> 
    <listdata name="0" /> 
    <listdata name="1" /> 
    <listdata name="2" /> 
    <listdata name="3" /> 
    <listdata name="4" /> 
    <listdata name="5" /> 
    <listdata name="6" /> 
    <listdata name="7" /> 
    <listdata name="8" /> 
    <listdata name="9" /> 
    </datalist> 
</main> 
2

है एक और विकल्प नहीं है। आइटम को लिखे या पढ़ने के तरीके को पूरी तरह से नियंत्रित करने के लिए आप हमेशा संग्रह (और किसी भी अन्य वर्ग या संरचना) में IXmlSerializable को कार्यान्वित कर सकते हैं। आप में से कई लोग पहले से ही यह जान लेंगे कि इसे आम तौर पर पसंद नहीं किया जाता है क्योंकि आप हाथ से "बॉयलर-प्लेट" कोड लिखना समाप्त कर सकते हैं जो वास्तव में विशेषताओं के साथ निर्दिष्ट स्वचालित तर्क होना चाहिए।

संग्रह के लिए जो एक समझदार स्कीमा से मेल खाना चाहिए यह उचित है। चूंकि ढांचे में यहां एक कठिन सीमा है और मौजूदा आइटम प्रकार के क्रमबद्धता कोड को सही तरीके से डुप्लिकेट करने की आवश्यकता नहीं है; यानी संग्रह कोड में आइटम क्रमबद्धता को दोबारा लिखें, बस अपने ReadXml/WriteXml कार्यान्वयन के अंदर एक बच्चे XmlSerializer को बनाएं/कॉल करें।

IXmlSerializable का उपयोग करने के परिणामस्वरूप यह आपको XmlTypeAttribute को लागू करने की अनुमति नहीं देता है (एक रनटाइम त्रुटि फेंकता है जो आपको बताता है कि केवल XmlRootAttribute का उपयोग किया जा सकता है)। तो इसके बजाय XmlSchemaProviderAttribute को लागू करें और उसी योग्य नाम को वापस करें जिसे आपने XmlTypeAttribute में रखा होगा। पुरानी गेटशेमा विधि को वैसे भी वापस लौटना चाहिए क्योंकि यह केवल एक आरक्षित विधि थी (एमएसडीएन के मुताबिक), शायद इसलिए कि वे एक अलग नेमस्पेस निर्दिष्ट करने की क्षमता को शामिल करना भूल गए थे। व्यक्तिगत रूप से मैं अपने XmlSchemaProviderAttribute में एक ही "GetSchema" विधि नाम का उपयोग करता हूं, इसलिए यह विरासत प्लेसहोल्डर GetSchema विधि के बगल में एक पूर्ण ओवरराइड के रूप में दिखाई देता है।

बेशक, सबसे अच्छा समाधान होगा यदि माइक्रोसॉफ्ट हमें संग्रह/सूची कक्षाओं में XmlArrayItemAttribute लागू करने और XmlSerializer में उपयोग करने की अनुमति देगा। डिफ़ॉल्ट रूप से यह संग्रह में एक्सएमएल प्रकार तत्व नाम का उपयोग करता है, जो मुझे लगता है कि एक बग है क्योंकि निर्दिष्ट होने पर या क्लास नाम होने पर यह XML रूट नाम होना चाहिए।

जब मुझे समय मिलता है तो मैं वापस आऊंगा और एक उदाहरण जोड़ूंगा। अब के लिए IXmlSerializable और XmlSchemaProviderAttribute के एमएसडीएन दस्तावेज़ उदाहरणों पर नज़र डालें।

http://msdn.microsoft.com/en-us/library/system.xml.serialization.ixmlserializable(v=vs.110).aspx

http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlschemaproviderattribute(v=vs.110).aspx

0

मैं जानता हूँ कि यह एक पुराने सवाल है, लेकिन मैं एक ही समस्या में पड़ गए और समाधान में से कोई भी ओ पी के सवाल Adresse लगता है।

#region Références 
using System.Collections.Generic; 
using System.Linq; 
using System.Xml; 
using System.Xml.Schema; 
using System.Xml.Serialization; 
#endregion 

namespace XmlSerializationTests 
{ 
    /// <summary> 
    /// Représente une liste qui peut être sérialisée en XML en tant que noeud racine. 
    /// </summary> 
    /// <typeparam name="T">Type des éléments de la liste.</typeparam> 
    public class XmlSerializableList<T> 
     : List<T>, IXmlSerializable 
    { 
     #region Variables 
     private static readonly XmlSerializer _ItemSerializer = new XmlSerializer(typeof(T)); 
     private static readonly string _ItemName; 
     private string _RootName; 
     #endregion 

     #region Méthodes 
     /// <summary> 
     /// Initialisation statique 
     /// </summary> 
     static XmlSerializableList() 
     { 
      _ItemName = (typeof(T).GetCustomAttributes(typeof(XmlRootAttribute), true).FirstOrDefault() as XmlRootAttribute)?.ElementName ?? typeof(T).Name; 
     } 

     /// <summary> 
     /// Obtient le nom racine. 
     /// </summary> 
     protected virtual string RootName 
     { 
      get 
      { 
       if (string.IsNullOrWhiteSpace(_RootName)) _RootName = (GetType().GetCustomAttributes(typeof(XmlRootAttribute), true).FirstOrDefault() as XmlRootAttribute)?.ElementName ?? GetType().Name; 
       return _RootName; 
      } 
     } 

     /// <summary> 
     /// Obtient le nom des éléments. 
     /// </summary> 
     protected virtual string ItemName 
     { 
      get { return _ItemName; } 
     } 

     /// <summary> 
     /// Cette méthode est réservée et ne doit pas être utilisée.Lorsque vous implémentez l'interface IXmlSerializable, vous devez retourner la valeur null (Nothing dans Visual Basic) à partir cette méthode et, si la spécification d'un schéma personnalisé est requise, appliquez à la place <see cref="T:System.Xml.Serialization.XmlSchemaProviderAttribute"/> à la classe. 
     /// </summary> 
     /// <returns> <see cref="T:System.Xml.Schema.XmlSchema"/> qui décrit la représentation XML de l'objet qui est généré par la méthode <see cref="M:System.Xml.Serialization.IXmlSerializable.WriteXml(System.Xml.XmlWriter)"/> et utilisé par la méthode <see cref="M:System.Xml.Serialization.IXmlSerializable.ReadXml(System.Xml.XmlReader)"/>.</returns> 
     public XmlSchema GetSchema() 
     { 
      return null; 
     } 

     /// <summary> 
     /// Génère un objet à partir de sa représentation XML. 
     /// </summary> 
     /// <param name="reader"><see cref="T:System.Xml.XmlReader"/> source à partir de laquelle l'objet est désérialisé.</param> 
     public void ReadXml(XmlReader reader) 
     { 
      if (!reader.IsEmptyElement) 
      { 
       reader.ReadStartElement(); 
       while (reader.NodeType != XmlNodeType.EndElement) 
       { 
        T item = (T) _ItemSerializer.Deserialize(reader); 
        Add(item); 
       } 
       reader.ReadEndElement(); 
      } 
      else reader.ReadStartElement(); 
     } 

     /// <summary> 
     /// Convertit un objet en sa représentation XML. 
     /// </summary> 
     /// <param name="writer"><see cref="T:System.Xml.XmlWriter"/> flux dans lequel l'objet est sérialisé.</param> 
     public void WriteXml(XmlWriter writer) 
     { 
      foreach (var i in this) 
      { 
       XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); 
       ns.Add("", ""); 
       _ItemSerializer.Serialize(writer, i, ns); 
      } 
     } 
     #endregion 
    } 
} 

और यहाँ एक इकाई परीक्षण वर्ग का उपयोग करें और परिणाम प्रदर्शित करने के लिए:

#region Références 
using System.IO; 
using System.Text; 
using System.Xml.Serialization; 
using Microsoft.VisualStudio.TestTools.UnitTesting; 
#endregion 

namespace XmlSerializationTests 
{ 
    [TestClass] 
    public class XmlSerializableListTests 
    { 
     public class Person 
     { 
      public string FirstName { get; set; } 
      public string LastName { get; set; } 
      public int Birth { get; set; } 
     } 

     [XmlRoot("color")] 
     public class ColorDefinition 
     { 
      [XmlElement("name")] public string Name { get; set; } 
      [XmlElement("r")] public int Red { get; set; } 
      [XmlElement("g")] public int Green { get; set; } 
      [XmlElement("b")] public int Blue { get; set; } 
     } 

     public class Persons : XmlSerializableList<Person> 
     { 
     } 

     [XmlRoot("colors")] 
     public class ColorList : XmlSerializableList<ColorDefinition> 
     { 
     } 

     private T ReadXml<T>(string text) where T : class 
     { 
      XmlSerializer serializer = new XmlSerializer(typeof (T)); 
      using (StringReader sr = new StringReader(text)) 
      { 
       return serializer.Deserialize(sr) as T; 
      } 
     } 

     private string WriteXml<T>(T data) where T : class 
     { 
      XmlSerializer serializer = new XmlSerializer(typeof(T)); 
      StringBuilder sb = new StringBuilder(); 
      using (StringWriter sw = new StringWriter(sb)) 
      { 
       serializer.Serialize(sw, data); 
       return sb.ToString(); 
      } 
     } 

     [TestMethod] 
     public void ReadEmpty() 
     { 
      string xml = @"<?xml version=""1.0"" encoding=""utf-16""?> 
<XmlSerializableListOfInt32> 
</XmlSerializableListOfInt32>"; 
      XmlSerializableList<int> lst = ReadXml<XmlSerializableList<int>>(xml); 
      Assert.AreEqual(0, lst.Count); 
     } 

     [TestMethod] 
     public void ReadEmpty2() 
     { 
      string xml = @"<?xml version=""1.0"" encoding=""utf-16""?> 
<XmlSerializableListOfInt32 />"; 
      XmlSerializableList<int> lst = ReadXml<XmlSerializableList<int>>(xml); 
      Assert.AreEqual(0, lst.Count); 
     } 

     [TestMethod] 
     public void ReadSimpleItems() 
     { 
      string xml = @"<?xml version=""1.0"" encoding=""utf-16""?> 
<XmlSerializableListOfInt32> 
    <int>0</int> 
    <int>52</int> 
    <int>79</int> 
</XmlSerializableListOfInt32>"; 
      XmlSerializableList<int> lst = ReadXml<XmlSerializableList<int>>(xml); 
      Assert.AreEqual(3, lst.Count); 
      Assert.AreEqual(0, lst[0]); 
      Assert.AreEqual(52, lst[1]); 
      Assert.AreEqual(79, lst[2]); 
     } 

     [TestMethod] 
     public void ReadComplexItems() 
     { 
      string xml = @"<?xml version=""1.0"" encoding=""utf-16""?> 
<XmlSerializableListOfPerson> 
    <Person> 
    <FirstName>Linus</FirstName> 
    <LastName>Torvalds</LastName> 
    <Birth>1969</Birth> 
    </Person> 
    <Person> 
    <FirstName>Bill</FirstName> 
    <LastName>Gates</LastName> 
    <Birth>1955</Birth> 
    </Person> 
    <Person> 
    <FirstName>Steve</FirstName> 
    <LastName>Jobs</LastName> 
    <Birth>1955</Birth> 
    </Person> 
</XmlSerializableListOfPerson>"; 
      XmlSerializableList<Person> lst = ReadXml<XmlSerializableList<Person>>(xml); 
      Assert.AreEqual(3, lst.Count); 
      Assert.AreEqual("Linus", lst[0].FirstName); 
      Assert.AreEqual("Torvalds", lst[0].LastName); 
      Assert.AreEqual(1969, lst[0].Birth); 
      Assert.AreEqual("Bill", lst[1].FirstName); 
      Assert.AreEqual("Gates", lst[1].LastName); 
      Assert.AreEqual(1955, lst[1].Birth); 
      Assert.AreEqual("Steve", lst[2].FirstName); 
      Assert.AreEqual("Jobs", lst[2].LastName); 
      Assert.AreEqual(1955, lst[2].Birth); 
     } 

     [TestMethod] 
     public void ReadInheritedPersons() 
     { 
      string xml = @"<?xml version=""1.0"" encoding=""utf-16""?> 
<Persons> 
    <Person> 
    <FirstName>Linus</FirstName> 
    <LastName>Torvalds</LastName> 
    <Birth>1969</Birth> 
    </Person> 
    <Person> 
    <FirstName>Bill</FirstName> 
    <LastName>Gates</LastName> 
    <Birth>1955</Birth> 
    </Person> 
    <Person> 
    <FirstName>Steve</FirstName> 
    <LastName>Jobs</LastName> 
    <Birth>1955</Birth> 
    </Person> 
</Persons>"; 
      Persons lst = ReadXml<Persons>(xml); 
      Assert.AreEqual(3, lst.Count); 
      Assert.AreEqual("Linus", lst[0].FirstName); 
      Assert.AreEqual("Torvalds", lst[0].LastName); 
      Assert.AreEqual(1969, lst[0].Birth); 
      Assert.AreEqual("Bill", lst[1].FirstName); 
      Assert.AreEqual("Gates", lst[1].LastName); 
      Assert.AreEqual(1955, lst[1].Birth); 
      Assert.AreEqual("Steve", lst[2].FirstName); 
      Assert.AreEqual("Jobs", lst[2].LastName); 
      Assert.AreEqual(1955, lst[2].Birth); 
     } 

     [TestMethod] 
     public void ReadInheritedColors() 
     { 
      string xml = @"<?xml version=""1.0"" encoding=""utf-16""?> 
<colors> 
    <color> 
    <name>red</name> 
    <r>255</r> 
    <g>0</g> 
    <b>0</b> 
    </color> 
    <color> 
    <name>green</name> 
    <r>0</r> 
    <g>255</g> 
    <b>0</b> 
    </color> 
    <color> 
    <name>yellow</name> 
    <r>255</r> 
    <g>255</g> 
    <b>0</b> 
    </color> 
</colors>"; 
      ColorList lst = ReadXml<ColorList>(xml); 
      Assert.AreEqual(3, lst.Count); 
      Assert.AreEqual("red", lst[0].Name); 
      Assert.AreEqual(255, lst[0].Red); 
      Assert.AreEqual(0, lst[0].Green); 
      Assert.AreEqual(0, lst[0].Blue); 
      Assert.AreEqual("green", lst[1].Name); 
      Assert.AreEqual(0, lst[1].Red); 
      Assert.AreEqual(255, lst[1].Green); 
      Assert.AreEqual(0, lst[1].Blue); 
      Assert.AreEqual("yellow", lst[2].Name); 
      Assert.AreEqual(255, lst[2].Red); 
      Assert.AreEqual(255, lst[2].Green); 
      Assert.AreEqual(0, lst[2].Blue); 
     } 

     [TestMethod] 
     public void WriteEmpty() 
     { 
      string xml = @"<?xml version=""1.0"" encoding=""utf-16""?> 
<XmlSerializableListOfInt32 />"; 
      XmlSerializableList<int> lst = new XmlSerializableList<int>(); 
      string result = WriteXml(lst); 
      Assert.AreEqual(xml, result); 
     } 

     [TestMethod] 
     public void WriteSimpleItems() 
     { 
      string xml = @"<?xml version=""1.0"" encoding=""utf-16""?> 
<XmlSerializableListOfInt32> 
    <int>0</int> 
    <int>52</int> 
    <int>79</int> 
</XmlSerializableListOfInt32>"; 
      XmlSerializableList<int> lst = new XmlSerializableList<int>() {0, 52, 79}; 
      string result = WriteXml(lst); 
      Assert.AreEqual(xml, result); 
     } 

     [TestMethod] 
     public void WriteComplexItems() 
     { 
      string xml = @"<?xml version=""1.0"" encoding=""utf-16""?> 
<XmlSerializableListOfPerson> 
    <Person> 
    <FirstName>Linus</FirstName> 
    <LastName>Torvalds</LastName> 
    <Birth>1969</Birth> 
    </Person> 
    <Person> 
    <FirstName>Bill</FirstName> 
    <LastName>Gates</LastName> 
    <Birth>1955</Birth> 
    </Person> 
    <Person> 
    <FirstName>Steve</FirstName> 
    <LastName>Jobs</LastName> 
    <Birth>1955</Birth> 
    </Person> 
</XmlSerializableListOfPerson>"; 
      XmlSerializableList<Person> persons = new XmlSerializableList<Person> 
      { 
       new Person {FirstName = "Linus", LastName = "Torvalds", Birth = 1969}, 
       new Person {FirstName = "Bill", LastName = "Gates", Birth = 1955}, 
       new Person {FirstName = "Steve", LastName = "Jobs", Birth = 1955} 
      }; 
      string result = WriteXml(persons); 
      Assert.AreEqual(xml, result); 
     } 

     [TestMethod] 
     public void WriteInheritedPersons() 
     { 
      string xml = @"<?xml version=""1.0"" encoding=""utf-16""?> 
<Persons> 
    <Person> 
    <FirstName>Linus</FirstName> 
    <LastName>Torvalds</LastName> 
    <Birth>1969</Birth> 
    </Person> 
    <Person> 
    <FirstName>Bill</FirstName> 
    <LastName>Gates</LastName> 
    <Birth>1955</Birth> 
    </Person> 
    <Person> 
    <FirstName>Steve</FirstName> 
    <LastName>Jobs</LastName> 
    <Birth>1955</Birth> 
    </Person> 
</Persons>"; 
      Persons lst = new Persons 
      { 
       new Person {FirstName = "Linus", LastName = "Torvalds", Birth = 1969}, 
       new Person {FirstName = "Bill", LastName = "Gates", Birth = 1955}, 
       new Person {FirstName = "Steve", LastName = "Jobs", Birth = 1955} 
      }; 
      string result = WriteXml(lst); 
      Assert.AreEqual(xml, result); 
     } 

     [TestMethod] 
     public void WriteInheritedColors() 
     { 
      string xml = @"<?xml version=""1.0"" encoding=""utf-16""?> 
<colors> 
    <color> 
    <name>red</name> 
    <r>255</r> 
    <g>0</g> 
    <b>0</b> 
    </color> 
    <color> 
    <name>green</name> 
    <r>0</r> 
    <g>255</g> 
    <b>0</b> 
    </color> 
    <color> 
    <name>yellow</name> 
    <r>255</r> 
    <g>255</g> 
    <b>0</b> 
    </color> 
</colors>"; 
      ColorList lst = new ColorList 
      { 
       new ColorDefinition { Name = "red", Red = 255, Green = 0, Blue = 0 }, 
       new ColorDefinition { Name = "green", Red = 0, Green = 255, Blue = 0 }, 
       new ColorDefinition { Name = "yellow", Red = 255, Green = 255, Blue = 0 } 
      }; 
      string result = WriteXml(lst); 
      Assert.AreEqual(xml, result); 
     } 
    } 
} 
संबंधित मुद्दे