【问题标题】:WCF DataContract deserialization issue with empty values具有空值的 WCF DataContract 反序列化问题
【发布时间】:2010-12-15 12:11:17
【问题描述】:

说我有类似的东西:

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

我收到了错误:

----> System.Xml.XmlException : 值 '' 不能被解析为类型 'Int64'。 ----> System.FormatException : 输入字符串的格式不正确。

我不明白为什么。 DataContractIsRequired 参数的默认值是 false 所以我希望它能够反序列化而没有错误,并使用类型的默认值(零)初始化缺失值。我错过了什么?

【问题讨论】:

标签: wcf serialization datacontractserializer datacontract


【解决方案1】:

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

与 IsRequired 的交互

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

而不是'给定数据成员值'

所以你应该让你的 XML 没有 &lt;ns2:Fee&gt; 元素来使它工作

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2011-06-28
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 2012-09-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-23
    • 1970-01-01
    相关资源
    最近更新 更多