2012-05-09 44 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())); 
    } 
}