使用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中的一个空数组。你能告诉我哪里做错了吗?
如果需要对序列化时发出的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> { }
DataContractSerializer
有自己的XML规则,不能支持所有的XML表单。我建议使用XmlSerializer。
使用这个定义
[XmlClass(Namespace = "http://schemas.datacontract.org/2004/07/ConsoleApplication6")]
public class Test
{
[XmlArray("values")]
[XmlArrayItem("String")]
public String[] values;
}