C# DataContractSerializer反序列化列表不工作

C# DataContractSerializer反序列化列表不工作,c#,xml,deserialization,C#,Xml,Deserialization,我必须反序列化从提供者收到的以下XML <desc> <l_error> <error>Error 1</error> <error>Error 2</error> </l_error> </desc> 错误1 错误2 为此,我使用DataContractSerializer,我定义了以下类来反序列化它 [CollectionDataContr

我必须反序列化从提供者收到的以下XML

<desc>
    <l_error>
         <error>Error 1</error>
         <error>Error 2</error>
    </l_error>
</desc>

错误1
错误2
为此,我使用DataContractSerializer,我定义了以下类来反序列化它

[CollectionDataContract(Name = "desc", Namespace = "")]
public class DescriptionError : List<Error>
{
}

[DataContract(Name = "l_error", Namespace = "")]
public class Error
{
    [DataMember(Name = "error")]
    public string Description { get; set; }
}
[CollectionDataContract(Name=“desc”,Namespace=”“)]
公共类描述符错误:列表
{
}
[DataContract(Name=“l_error”,Namespace=”“)]
公共类错误
{
[DataMember(Name=“error”)]
公共字符串说明{get;set;}
}
和一个泛型方法进行反序列化

public static T Deserialize<T>(string text)
{
    using (MemoryStream stream = text.ToStream())
    {
         var serializer = new DataContractSerializer(typeof(T));
         return (T)serializer.ReadObject(stream);
    }
}
publicstatict反序列化(字符串文本)
{
使用(MemoryStream stream=text.ToStream())
{
var serializer=新的DataContractSerializer(typeof(T));
return(T)serializer.ReadObject(stream);
}
}
问题是,当我反序列化上述XML时,返回的DescriptionError对象只包含一个元素,第一个“错误1”,XML中的第二个错误项不在DescriptionError中。我不知道我做错了什么


谢谢。

您的对象类应该看起来像是可以用来从XML获取c类的

using System;
using System.Xml.Serialization;
using System.Collections.Generic;
namespace MyNamespace
{
    [XmlRoot(ElementName="l_error")]
    public class L_error {
        [XmlElement(ElementName="error")]
        public List<string> Error { get; set; }
    }

    [XmlRoot(ElementName="desc")]
    public class Desc {
        [XmlElement(ElementName="l_error")]
        public L_error L_error { get; set; }
    }

}
使用系统;
使用System.Xml.Serialization;
使用System.Collections.Generic;
名称空间MyNamespace
{
[XmlRoot(ElementName=“l_error”)]
公共类L_错误{
[xmlement(ElementName=“error”)]
公共列表错误{get;set;}
}
[XmlRoot(ElementName=“desc”)]
公共类描述{
[XmlElement(ElementName=“l_错误”)]
公共L_错误L_错误{get;set;}
}
}

您有错误的
公共字符串描述{get;set;}
应该类似于
公共列表描述{get;set;}

您的对象类应该类似于您可以使用它从XML中获取c类

using System;
using System.Xml.Serialization;
using System.Collections.Generic;
namespace MyNamespace
{
    [XmlRoot(ElementName="l_error")]
    public class L_error {
        [XmlElement(ElementName="error")]
        public List<string> Error { get; set; }
    }

    [XmlRoot(ElementName="desc")]
    public class Desc {
        [XmlElement(ElementName="l_error")]
        public L_error L_error { get; set; }
    }

}
使用系统;
使用System.Xml.Serialization;
使用System.Collections.Generic;
名称空间MyNamespace
{
[XmlRoot(ElementName=“l_error”)]
公共类L_错误{
[xmlement(ElementName=“error”)]
公共列表错误{get;set;}
}
[XmlRoot(ElementName=“desc”)]
公共类描述{
[XmlElement(ElementName=“l_错误”)]
公共L_错误L_错误{get;set;}
}
}

您有错误的
公共字符串描述{get;set;}
应该类似于
公共列表描述{get;set;}

通常解决这个问题的最佳方法是反过来工作-创建对象并序列化它们,以查看您将得到什么样的XML

如果你看一下你所拥有的,你有一个似乎暗示着一个
desc
元素,它有多个
l\u error
子元素,其中包含一个
error
。显然,这与您的XML不匹配

这更符合您的需要—单个
desc
元素包含一个
l_error
元素,该元素包含多个
error
字符串元素

[DataContract(Name = "desc", Namespace = "")]
public class Desc
{
    [DataMember(Name = "l_error")]
    public LError LError { get; set; }
}

[CollectionDataContract(ItemName = "error", Namespace = "")]
public class LError : List<string>
{    
}
[DataContract(Name=“desc”,Namespace=”“)]
公共类描述
{
[DataMember(Name=“l_error”)]
公共LError LError{get;set;}
}
[CollectionDataContract(ItemName=“error”,Namespace=”“)]
公共类错误:列表
{    
}

通常,解决这个问题的最佳方法是另一种方法——创建对象并序列化它们,以查看将得到什么样的XML

如果你看一下你所拥有的,你有一个似乎暗示着一个
desc
元素,它有多个
l\u error
子元素,其中包含一个
error
。显然,这与您的XML不匹配

这更符合您的需要—单个
desc
元素包含一个
l_error
元素,该元素包含多个
error
字符串元素

[DataContract(Name = "desc", Namespace = "")]
public class Desc
{
    [DataMember(Name = "l_error")]
    public LError LError { get; set; }
}

[CollectionDataContract(ItemName = "error", Namespace = "")]
public class LError : List<string>
{    
}
[DataContract(Name=“desc”,Namespace=”“)]
公共类描述
{
[DataMember(Name=“l_error”)]
公共LError LError{get;set;}
}
[CollectionDataContract(ItemName=“error”,Namespace=”“)]
公共类错误:列表
{    
}

这些属性用于XmlSerializer,我正在使用DataContractSerializer进行反序列化。因为您给了我一个XmlSerializer的解决方案,我想问一个与DataContractSerializer相关的问题,但在XmlSerializer下面才是真正的问题:)我发布XmlSerializer只是为了比较您的代码,您可以清楚地看到您缺少一个
公共列表错误
,在您的案例中,
公共列表描述
XmlSerializer和DataContractSerializer是不相关的类,它们以不同的方式处理集合。看看我谈论的结构,你能说你的问题解决了还是有更多的问题吗?这些属性是针对XmlSerializer的,我正在使用DataContractSerializer进行反序列化。因为您给了我一个XmlSerializer的解决方案,我想问一个与DataContractSerializer相关的问题,但在XmlSerializer下面才是真正的问题:)我发布XmlSerializer只是为了比较您的代码,您可以清楚地看到您缺少一个
公共列表错误
,在您的案例中,
公共列表描述
XmlSerializer和DataContractSerializer是不相关的类,它们以不同的方式处理集合。看看我谈论的结构,你能说你的案子解决了还是你有更多的问题?