我正在尝试反序列化类似于以下
的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中看到并清空了数组。你能告诉我我做错了吗?提前谢谢。
答案 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>
派生自定义类型。这必须仅仅是为了挂起CollectionDataContractAttribute
。 CollectionDataContractAttribute
允许您在<values>
内指定元素的名称。
[DataContract]
public class Test
{
[DataMember(Name = "values")]
public TestValues values;
}
[CollectionDataContract(ItemName = "String")]
public class TestValues : List<string> { }