带有空值的WCF DataContract反序列化问题

时间:2010-12-15 12:11:17

标签: wcf serialization datacontractserializer datacontract

说我有类似的东西:

[DataContract(Namespace="http://bla.bla")]
public class MyClass {
    [DataMember] public long ResponseCode { get; set; }
    [DataMember] public long Fee { get; set; }
}

以下内容来自频道:

<ns0:MyResult>
    <ns2:ResponseCode xmlns:ns2="http://bla.bla">101</ns2:ResponseCode>
    <ns2:Fee xmlns:ns2="http://bla.bla"></ns2:Fee>
</ns0:MyResult>

我收到了错误:

----&GT; System.Xml.XmlException:无法将值''解析为类型'Int64'。   ----&GT; System.FormatException:输入字符串的格式不正确。

我不明白为什么。 IsRequired的{​​{1}}参数的默认值为DataContract,因此我希望它能无错误地反序列化,并使用类型(零)的默认值初始化缺失值。我错过了什么?

1 个答案:

答案 0 :(得分:3)

来自 - http://msdn.microsoft.com/en-us/library/aa347792.aspx

  

与IsRequired的互动

     

如数据协定版本控制中所述,DataMemberAttribute属性具有IsRequired属性(默认值为false)。该属性指示序列化数据在反序列化时是否必须存在给定数据成员。如果IsRequired设置为true(表示必须存在值)并且EmitDefaultValue设置为false(表示如果将值设置为其默认值,则该值不得出现),此数据成员的默认值不能为序列化因为结果会相互矛盾。 如果将此类数据成员设置为其默认值(通常为null或0)并尝试进行序列化,则抛出SerializationException

而非'给定数据成员值'

因此您应该使用不带<ns2:Fee>元素的XML来使其正常工作

<ns0:MyResult>
    <ns2:ResponseCode xmlns:ns2="http://bla.bla">101</ns2:ResponseCode>
</ns0:MyResult>

然而,我也在寻找解决您问题的方法。如何使我的WCF捕获此异常并自动为int或date类型设置其默认值。

另一个想法是如果我尝试跟随 - 使用i:nil =“true” -

<MyParentElement xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<MyElement i:nil="true"></MyElement>
</MyParentElement>

它应该能够设置自定义默认值。我不一定希望客户端缺少元素来指示传递的默认值。缺少元素也可能意味着客户端正在使用旧版本的数据合同。