C# 如何反序列化根元素多于同一类型多个子元素的Xml

C# 如何反序列化根元素多于同一类型多个子元素的Xml,c#,xml,datacontractserializer,C#,Xml,Datacontractserializer,我正在尝试反序列化如下所示的xml文档 <invoices> <invoice>2848</invoice> <invoice>2849</invoice> <invoice>2850</invoice> <invoice>2851</invoice> <invoice>2852</invoice> </invoices> 当然,这

我正在尝试反序列化如下所示的xml文档

<invoices>
  <invoice>2848</invoice>
  <invoice>2849</invoice>
  <invoice>2850</invoice>
  <invoice>2851</invoice>
  <invoice>2852</invoice>
</invoices>
当然,这是行不通的。我得到这个错误:

{"Error in line 1 position 24. Expecting state 'Element'.. Encountered 'Text'  with name '', namespace ''. "}
我无法控制Xml。

在这种情况下尝试使用[CollectionDataContract]:

public class StackOverflow_10705733
{
    [CollectionDataContract(Name = "invoices", ItemName = "invoice", Namespace = "")]
    public class Invoices : List<int>
    {
        [DataMember(Name = "invoice")]
        public int[] InvoiceIds { get; set; }
    }
    public static void Test()
    {
        DataContractSerializer dcs = new DataContractSerializer(typeof(Invoices));
        string xml = @"<invoices>
                          <invoice>2848</invoice>
                          <invoice>2849</invoice>
                          <invoice>2850</invoice>
                          <invoice>2851</invoice>
                          <invoice>2852</invoice>
                        </invoices>";
        MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(xml));
        Invoices value = dcs.ReadObject(ms) as Invoices;
        Console.WriteLine(string.Join(",", value));
    }
}
尝试在此场景中使用[CollectionDataContract]:

public class StackOverflow_10705733
{
    [CollectionDataContract(Name = "invoices", ItemName = "invoice", Namespace = "")]
    public class Invoices : List<int>
    {
        [DataMember(Name = "invoice")]
        public int[] InvoiceIds { get; set; }
    }
    public static void Test()
    {
        DataContractSerializer dcs = new DataContractSerializer(typeof(Invoices));
        string xml = @"<invoices>
                          <invoice>2848</invoice>
                          <invoice>2849</invoice>
                          <invoice>2850</invoice>
                          <invoice>2851</invoice>
                          <invoice>2852</invoice>
                        </invoices>";
        MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(xml));
        Invoices value = dcs.ReadObject(ms) as Invoices;
        Console.WriteLine(string.Join(",", value));
    }
}
我不熟悉DataContractSerializer,但要序列化任何普通类,必须将其标记为可序列化。DataContract会这样做吗?@jp2code,DataContractSerializer不需要[Serializable]属性。它可以序列化用它标记的类型,也可以序列化其他DataContract、CollectionDataContract、IXmlSerializable,甚至可以序列化没有任何标记的类型,对于这些类型,它使用一些关于序列化内容的约定。我不熟悉DataContractSerializer,但要序列化任何普通类,必须将其标记为Serializable。DataContract会这样做吗?@jp2code,DataContractSerializer不需要[Serializable]属性。它可以序列化用它标记的类型,也可以序列化其他DataContract、CollectionDataContract、IXmlSerializable,甚至可以序列化没有标记任何内容的类型,对于这些类型,它使用一些关于序列化内容的约定。