说我有类似的东西:
[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
,因此我希望它能无错误地反序列化,并使用类型(零)的默认值初始化缺失值。我错过了什么?
答案 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>
它应该能够设置自定义默认值。我不一定希望客户端缺少元素来指示传递的默认值。缺少元素也可能意味着客户端正在使用旧版本的数据合同。