我正在尝试使用DataContractSerializer来读取xml文件并从xml实例化对象,但无法获得正确反序列化的对象引用。我将在不久的将来使用WCF,并且已经读过在WCF中使用DataContractSerializer。
我过去使用过XMLSerializer并且没有问题。
下面是一个说明问题的简单示例。 Child-> Age的值将返回0而不是XML中的值。我一直试图弄清楚这一点并没有多少运气。
我最初将Child对象作为null返回,但是又决定再次运行代码,现在Child正在实例化但是Age值没有设置。我不知道为什么 - 只是另一件事要混淆我:)
[DataContract(Namespace="")]
public class Parent
{
[DataMember]
public Child Child;
[DataMember]
public string FirstName;
[DataMember]
public string LastName;
}
[DataContract]
public class Child
{
[DataMember]
public int Age;
}
XmlReader reader = XmlReader.Create(System.IO.File.OpenRead("D:/Sandbox/WebApplication1/xml/parent.xml"));
DataContractSerializer ser = new DataContractSerializer(typeof(Parent));
Parent parent = (Parent)ser.ReadObject(reader, true);
答案 0 :(得分:0)
age
是int
。 int
是一个带符号的32位整数,不允许空值。如果您希望将其设为null
,请将其类型更改为int?
,使其成为Nullable Type。
答案 1 :(得分:0)
或者你实际上是否有往返问题?换句话说,您序列化此类型的对象,然后当您尝试反序列化它时,您会遇到Age未被完全读取的问题。
我怀疑它是前者(手写或用户制作的XML,至少部分是这样)。我建议通过DataContractSerializer序列化完全相同的对象(即,从所需的目标对象开始并将其写入XML)并比较与您尝试阅读的XML的不同之处。
答案 2 :(得分:0)
如果您可以从Parent类中删除命名空间,它应该能够准确地反序列化。
[DataContract] // Removed Namespace or keep both namespace the same
public class Parent
{
[DataMember]
public Child Child;
[DataMember]
public string FirstName;
[DataMember]
public string LastName;
}
[DataContract]
public class Child
{
[DataMember]
public int Age;
}