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