无法使用DataContractSerializer获取反序列化的对象引用

时间:2010-11-09 15:43:51

标签: c# datacontractserializer

我正在尝试使用DataContractSerializer来读取xml文件并从xml实例化对象,但无法获得正确反序列化的对象引用。我将在不久的将来使用WCF,并且已经读过在WCF中使用DataContractSerializer。

我过去使用过XMLSerializer并且没有问题。

下面是一个说明问题的简单示例。 Child-> Age的值将返回0而不是XML中的值。我一直试图弄清楚这一点并没有多少运气。

我最初将Child对象作为null返回,但是又决定再次运行代码,现在Child正在实例化但是Age值没有设置。我不知道为什么 - 只是另一件事要混淆我:)


结果


    • Child =实例化
      • 年龄= 0这就是问题所在。早些时候,这是空的,我不确定               改变了什么导致它被实例化。
    • FirstName =“Joe”
    • LastName =“Smith”

课程


[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);  

3 个答案:

答案 0 :(得分:0)

ageintint是一个带符号的32位整数,不允许空值。如果您希望将其设为null,请将其类型更改为int?,使其成为Nullable Type

答案 1 :(得分:0)

汤姆,我不完全确定为什么会这样,至少根据你粘贴的例子。您的XML是完全手工制作的吗?

或者你实际上是否有往返问题?换句话说,您序列化此类型的对象,然后当您尝试反序列化它时,您会遇到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;
}