如何在C#中反序列化包含多种类型元素的XML数组

我正在尝试反序列化以下文件:

   Wayne Stamkos 23 34   Sidney Lindros 41 44   Martin Roy 15 12   Paul Forsberg 21 51   Roberto Rinne 18 23    

使用以下代码:

 namespace ConsoleApplication2 { [XmlRoot("league")] public class League { [XmlArray("players")] [XmlArrayItem("skater")] public List skaters { get; set; } [XmlArrayItem("goalie")] public List goalies { get; set; } } public class Skater { [XmlElement("name")] public string Name; [XmlElement("goals")] public int Goals; [XmlElement("assists")] public int Assists; } public class Goalie { [XmlElement("name")] public string Name; [XmlElement("wins")] public int Wins; [XmlElement("losses")] public int Losses; } class Program { static void Main(string[] args) { using (FileStream reader = new FileStream(@"C:\Temp\test.xml", FileMode.Open, FileAccess.Read)) { var ser = new XmlSerializer(typeof(League)); League league = (League)ser.Deserialize(reader); } } } } 

我期待得到一个联盟对象,其中包含一个包含3个元素的Skaters列表和一个包含2个元素的守门员列表。 我确实得到了预期的Skaters列表但是守门员列表是空的。 我究竟做错了什么?

有两种方法可以做到这一点; 首先是做一些事情:

 [XmlArray("players")] [XmlArrayItem("skater", Type=typeof(Skater))] [XmlArrayItem("goalie", Type=typeof(Goalie))] public List Players { get; set; } 

它将两个元素类型映射到单个集合中。 最糟糕的情况是, SomeCommonBaseClass可能是object

 [XmlArray("players")] [XmlArrayItem("skater", Type=typeof(Skater))] [XmlArrayItem("goalie", Type=typeof(Goalie))] public List Players { get; set; } 

第二个是让映射到包装器对象:

 [XmlElement("players")] public Players Players { get;set;} ... public class Players { [XmlElement("skater")] public List Skaters {get;set;} [XmlElement("goalie")] public List Goalies {get;set;} } 

选择哪个取决于具体情况; 后者允许“至多一个守门员”之类的东西,通过将其改为:

  [XmlElement("goalie")] public Goalie Goalie {get;set;}