如何让XmlRoot拥有一组对象?

时间:2011-03-30 21:29:26

标签: c# serialization collections xml-serialization

我正在试图弄清楚如何将以下类序列化为XML(以特定方式,见下文):

[XmlRoot("Farm")]
public class Farm
{
    [XmlArray]
    [XmlArrayItem("Person", typeof(Person))]
    [XmlArrayItem("Dog", typeof(Dog))]
    public List<Animal> Animals { get; set; }
}

(假设DogPerson都来自Animal,并且它们都有一个Name属性,用[XmlAttribute("Name")]修饰。)

我需要能够创建这个对象:

var myFarm = new Farm
{
    Animals = new List<Animal> { 
        new Person { Name = "Bob" },  
        new Dog { Name = "Fido" }
    }
};

...并将其序列化为以下文档:

<?xml version="1.0"?>
<Farm>
    <Person Name="Bob"/>
    <Dog Name="Fido"/>
</Farm>

但是,当我将myFarm(结果输出到控制台)序列化时,这样:

var serializer = new XmlSerializer(typeof(Farm));
var namespaces = new XmlSerializerNamespaces();
namespaces.Add("", "");
serializer.Serialize(System.Console.Out, myFarm, namespaces);

......结果如下:

<?xml version="1.0"?>
<Farm>
    <Animals>
        <Person Name="Bob"/>
        <Dog Name="Fido"/>
    </Animals>
</Farm>

请注意额外不需要的动物元素。我怎么摆脱这个?更改XML模式不是一种选择,但更改代码是。我真的只是希望能够解决这个问题,并希望有人知道一个简单的解决方案(或者知道一个事实,即没有一个简单的解决方案)。

谢谢!

1 个答案:

答案 0 :(得分:2)

请改用以下属性:

[XmlRoot("Farm")]
public class Farm
{
    [XmlElement("Person", typeof(Person))]
    [XmlElement("Dog", typeof(Dog))]
    public List<Animal> Items { get; set; }
}