空值的 WCF DataContract 反序列化问题

发布于 2024-10-07 21:40:38 字数 711 浏览 6 评论 0原文

假设我有类似的内容:

[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,因此我希望它能够无错误地反序列化,并使用该类型的默认值初始化缺失值(零)。我缺少什么?

Say i have something like:

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

and the following is coming from a channel:

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

I'm getting the error:

----> System.Xml.XmlException : The value '' cannot be parsed as the type 'Int64'.
----> System.FormatException : Input string was not in a correct format.

I don't understand why. The default value of IsRequired parameter of DataContract is false so i expect it to deserialize without errors and initialize the missing value with default values for the type (zero). What am i missing?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

幻梦 2024-10-14 21:40:38

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

与 IsRequired 交互

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

而不是“给定数据成员值”,

因此您的 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>

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

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

Interaction with IsRequired

As discussed in Data Contract Versioning, the DataMemberAttribute attribute has an IsRequired property (the default is false). The property indicates whether a given data member must be present in the serialized data when it is being deserialized. If IsRequired is set to true, (which indicates that a value must be present) and EmitDefaultValue is set to false (indicating that the value must not be present if it is set to its default value), default values for this data member cannot be serialized because the results would be contradictory. If such a data member is set to its default value (usually null or zero) and a serialization is attempted, a SerializationException is thrown.

and not 'given data member value'

so you should have your XML without <ns2:Fee> element to make it work

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

However, I am also looking for solution to your problem. How can I make my WCF catch this exception and set its default value automatically for type int or dates.

Another idea is if i try following - using i:nil="true" -

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

it should be able to set custom default value. I do not necessarily want a missing element from client to indicate default value passed. Missing element could also mean client is using older version of data contract.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文