使用DataContractSerializer进行反序列化

时间:2015-09-30 00:26:28

标签: c# xml-serialization

我正在尝试反序列化类似于以下

的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);
        }

但是没有一个值是反序列化的。我只是在Test rr中看到并清空了数组。你能告诉我我做错了吗?提前谢谢。

2 个答案:

答案 0 :(得分:1)

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

使用此定义

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

答案 1 :(得分:1)

如果您需要对序列化时发出的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> { }
相关问题