2011-03-30 97 views
2

我想弄清楚如何序列下面的类转换为XML(以特殊的方式,见下文):如何让XmlRoot获得对象集合?

[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模式不是一种选择,但更改代码是。我真的想能够解决这个问题,并希望有人知道一个简单的修复(或知道一个事实,有一个简单的修复)。

谢谢!

回答

2

使用下列属性来代替:

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

就像一个魅力,谢谢! – 2011-03-30 21:52:57