使用DataContractSerializer进行反序列化

本文关键字:反序列化 DataContractSerializer 使用 | 更新日期: 2023-09-27 18:15:16

我正在尝试反序列化一个xml文件,看起来像下面的

<?xml version="1.0"?>
<Test xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/ConsoleApplication6">
  <values>
    <String>Value 1</String>
    <String>Value 2</String>
  </values>
</Test>

指向一个对象,该对象是

[DataContract(Namespace = "http://schemas.datacontract.org/2004/07/ConsoleApplication6")]
public class Test
{
    [DataMember(Name = "values")]
    public String[] values;
}

var ds = new DataContractSerializer(typeof(Test));
        using (Stream stream1 = File.OpenRead(@"C:'Projects'test1.xml"))
        {
            Test rr = (Test)ds.ReadObject(stream1);
        }

但是没有一个值是反序列化的。我只看到testrr中的一个空数组。你能告诉我哪里做错了吗?

使用DataContractSerializer进行反序列化

如果需要对序列化时发出的XML进行精细控制,则不应该使用DataContractSerializer。它的灵活性非常有限。您最好使用XmlSerializer,它也有局限性,但比DataContractSerializer灵活得多。

话虽如此,以下是如何使用DataContractSerializer的方法。

将xml中的默认名称空间更改为使用DataContractSerializer默认使用的名称空间

<?xml version="1.0"?>
<Test xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/">
  <values>
    <String>Value 1</String>
    <String>Value 2</String>
  </values>
</Test>

不要使用string[],创建您自己的自定义类型,它派生自List<string>。这样做的唯一目的是为了有东西挂CollectionDataContractAttributeCollectionDataContractAttribute允许您指定<values>中元素的名称。

[DataContract]
public class Test
{
    [DataMember(Name = "values")]
    public TestValues values;
}
[CollectionDataContract(ItemName = "String")]
public class TestValues : List<string> { }

DataContractSerializer有自己的XML规则,不能支持所有的XML表单。我建议使用XmlSerializer。

使用这个定义

[XmlClass(Namespace = "http://schemas.datacontract.org/2004/07/ConsoleApplication6")]
public class Test
{
    [XmlArray("values")]
    [XmlArrayItem("String")]
    public String[] values;
}