使用 DataContractSerializer 反序列化

Deserialize using DataContractSerializer

我正在尝试反序列化如下所示的 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);
        }

但是 none 的值正在反序列化。我只是在 Test rr 中看到和清空数组。你能告诉我我做错了什么吗?提前致谢。

DataContractSerializer 有自己的 XML 规则,无法支持所有 XML 形式。我建议使用 XmlSerializer.

使用这个定义

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

如果您需要对序列化时发出的 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> 的自定义类型。这必须完全是为了有东西挂在 CollectionDataContractAttribute 上。 CollectionDataContractAttribute 可以让您指定 <values>.

中元素的名称
[DataContract]
public class Test
{
    [DataMember(Name = "values")]
    public TestValues values;

}

[CollectionDataContract(ItemName = "String")]
public class TestValues : List<string> { }