C# 使用DataContractSerializer反序列化对象中的XML

C# 使用DataContractSerializer反序列化对象中的XML,c#,xml,C#,Xml,我有以下xml: <ArrayOfString> <stringValues> <stringvalue>teste1</stringvalue> <stringList> <stringText>stringList1</stringText> </st

我有以下xml:

<ArrayOfString>
    <stringValues>
        <stringvalue>teste1</stringvalue>
        <stringList> 
             <stringText>stringList1</stringText>                                   
        </stringList>
    </stringValues>
</ArrayOfString>

测试1
字符串列表1
我的合同如下:

[KnownType(typeof(StringList))]
[DataContract(Name = "stringValues", Namespace = "")]
public class StringValues
{

    [DataMember(Name="stringvalue",Order=1)]
    public string stringvalue { get; set; }

    [DataMember(Name="stringList",Order=2)]
    public StringList stringList { get; set; }
}

[CollectionDataContract(ItemName = "stringText")]
public class StringList : List<string>
{

}
[KnownType(typeof(StringList))]
[DataContract(Name=“stringValues”,Namespace=”“)]
公共类字符串值
{
[DataMember(Name=“stringvalue”,Order=1)]
公共字符串stringvalue{get;set;}
[DataMember(Name=“stringList”,Order=2)]
公共字符串列表字符串列表{get;set;}
}
[CollectionDataContract(ItemName=“stringText”)]
公共类字符串列表:列表
{
}
用于反序列化的代码是:

var testexml = @"<ArrayOfString>
                            <stringValues>
                                <stringvalue>teste1</stringvalue>
                                <stringList> 
                                    <stringText>stringList1</stringText>                                   
                                </stringList>
                            </stringValues>
                         </ArrayOfString>";

        XmlDictionaryReader stringsReader = XmlDictionaryReader.CreateDictionaryReader(XmlReader.Create(new StringReader(testexml)));
        DataContractSerializer ArrayOfString = new DataContractSerializer(typeof(List<StringValues>), "ArrayOfString", "");
        var strings = ArrayOfString.ReadObject(stringsReader);
var testexml=@”
测试1
字符串列表1
";
XmlDictionaryReader stringsReader=XmlDictionaryReader.CreateDictionaryReader(XmlReader.Create(new StringReader(testexml));
DataContractSerializer ArrayOfString=新的DataContractSerializer(typeof(List),“ArrayOfString”,和“”);
var strings=ArrayOfString.ReadObject(stringsReader);
当我运行它时,stringList属性应该有一个项,但是它没有任何项。 我相信,我的合同有问题。有人能帮忙吗


提前谢谢

调试此类反序列化问题的最佳方法是创建类的内存中示例,然后将其序列化为字符串,并将得到的内容与要反序列化的内容进行比较。如果有差异,那就是你的错误

下面的代码显示了如何为类创建示例序列化XML:

    private static MemoryStream GenerateStreamFromString(string value)
    {
        return new MemoryStream(Encoding.Unicode.GetBytes(value ?? ""));
    }

    private static string GetXml<T>(T obj, DataContractSerializer serializer) where T : class 
    {
        using (var textWriter = new StringWriter())
        {
            XmlWriterSettings settings = new XmlWriterSettings();
            settings.Indent = true;
            settings.IndentChars = "    "; // The indentation used in the test string.
            using (XmlWriter xmlWriter = XmlWriter.Create(textWriter, settings))
            {
                serializer.WriteObject(xmlWriter, obj);
            }
            return textWriter.ToString();
        }
    }

    public static string GetXml<T>(T obj) where T : class
    {
        DataContractSerializer serializer = new DataContractSerializer(typeof(T));
        return GetXml(obj, serializer);
    }
其中
Clr.Namespace
是定义类的Clr命名空间。(是的,显然是
DataContractSerializer
,但没有任何指令另行说明。)

如果不想重复执行此操作,还可以在整个模块或程序集上使用该属性

[CollectionDataContract(ItemName = "stringText", Namespace="")]
public class StringList : List<string>
{

}
<?xml version="1.0" encoding="utf-16"?>
<ArrayOfstringValues xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
    <stringValues>
        <stringvalue>teste1</stringvalue>
        <stringList xmlns:d3p1="http://schemas.datacontract.org/2004/07/Clr.Namespace">
            <d3p1:stringText>stringList1</d3p1:stringText>
        </stringList>
    </stringValues>
</ArrayOfstringValues>