2012-05-09 46 views
2

我似乎能夠在網上找到人誰試圖避免這種行爲,但我似乎無法得到我想要的行爲。序列化列表<T>的基類與父標籤

我有動物名單,我想對每個動物的不同類型的標籤(而不是默認的beahviour與武官屬性)

連載他們要獲得這種行爲,我用下面的代碼

[XmlElementAttribute(Order = 4)] 
    [XmlElement("Frog", typeof(Frog))] 
    [XmlElement("Cat", typeof(Cat))] 
    [XmlElement("Dog", typeof(Dog))] 
    public List<Animal> lines = new List<Animal>(); 

偉大的工程,但它變平的名單,我會更喜歡它,如果XML輸出更像 <animals> <Dog>Bob</Dog> <Cat>Fred</Cat> <Dog>Mike</Dog> </animals><animals>標籤保存

+0

您應該爲每種動物類型分別設置不同的類。 –

+0

你如何序列化它? – JotaBe

回答

2

更改爲[XmlElementAttribute(Order = 4)][XmlArrayAttribute(Order=4)]

你也可以指定在屬性,ElementName參數,將是根名稱,即:[XmlArrayAttribute(Order=4, ElementName="animals")]

* 注意:Order = 4是針對這種情況。你通常不需要它。 *

編輯:(thaks到OP評論):

您還可以belongin從[XmlElement]列表中的對象類的屬性更改爲[XmlArrayItem](MSDN doc here),就像這樣:

[XmlArrayItem("Frog", typeof(Frog))] 
[XmlArrayItem("Cat", typeof(Cat))] 
[XmlArrayItem("Dog", typeof(Dog))] 
+0

這正是我尋找的解決方案,可能暫時找不到,所以謝謝!對於任何其他參與此解決方案的人來說,值得添加的是,如果使用XmlArrayAttribute,則還需要將XmlElements更改爲XmlArrayItems。 – user1217210

+0

感謝您的評論。我完全忘了那個細節! – JotaBe

0

您可以隨時換名單在其自己的類,你會得到你所期望的XML:

public class StackOverflow_10524470 
{ 
    public class Animal 
    { 
     [XmlText] 
     public string Name { get; set; } 
    } 
    public class Dog : Animal { } 
    public class Cat : Animal { } 
    public class Frog : Animal { } 
    public class Root 
    { 
     [XmlElementAttribute(Order = 4, ElementName = "animals")] 
     public Animals animals; 
    } 
    public class Animals 
    { 
     [XmlElementAttribute(Order = 4)] 
     [XmlElement("Frog", typeof(Frog))] 
     [XmlElement("Cat", typeof(Cat))] 
     [XmlElement("Dog", typeof(Dog))] 
     public List<Animal> lines = new List<Animal>(); 
    } 
    public static void Test() 
    { 
     MemoryStream ms = new MemoryStream(); 
     XmlSerializer xs = new XmlSerializer(typeof(Root)); 
     Root root = new Root 
     { 
      animals = new Animals 
      { 
       lines = new List<Animal> 
       { 
        new Dog { Name = "Fido" }, 
        new Cat { Name = "Fluffy" }, 
        new Frog { Name = "Singer" }, 
       } 
      } 
     }; 
     xs.Serialize(ms, root); 
     Console.WriteLine(Encoding.UTF8.GetString(ms.ToArray())); 
    } 
}