还有其他原因说明我应该考虑忽略发出默认值是一种不好的做法吗?

2024-05-24

我已经使用 WCF 一段时间了,并且在客户端和服务器倾向于共同发布的地方;也就是说,新版本几乎总是同时发布。互操作性和版本控制不是问题(至少在这种情况下)。

MSDN 文档,DataMemberAttribute.EmitDefaultValue http://msdn.microsoft.com/en-us/library/system.runtime.serialization.datamemberattribute.emitdefaultvalue.aspx and 数据合同版本控制 http://msdn.microsoft.com/en-us/library/ms731138.aspx,表明除非有特定需要并支持版本控制,否则发出默认值是一种不好的做法。

在实践中,我发现省略默认值很有用,有时也很重要,特别是当 WCF 服务必须回调多个客户端时。在高负载时,较大的消息会给服务器带来较高的内存压力,并且传输时间较长。

还有其他原因应该避免这种情况吗?


我也在使用DataMemberAttribute.EmitDefaultValue = false在某些地方尝试限制正在传输的数据量。就我而言,我控制着客户端和服务器端的事物,所以我没有任何问题。

我确实找到了一个参考 http://msdn.microsoft.com/en-us/library/aa347792.aspx与潜在的冲突DataMemberAttribute.IsRequired,我以前不知道:

与 IsRequired 交互

...If 是必须的被设定为true,(表示必须存在一个值)和发出默认值被设定为false(表明该值不得 如果设置为默认值则存在),默认值 数据成员无法序列化,因为结果将是 矛盾的。如果这样的数据成员设置为其默认值 (通常为空或零)并尝试序列化, 抛出 SerializationException。

通常,这应该不是问题,因为一旦您尝试序列化带有标记为的成员的对象EmitDefaultValue = false, IsRequired = true,和一个默认值,你会得到一个SerializationExeception,所以问题就很明显了(我刚刚测试了一下)。然而,我可以看到这样的情况:EmitDefaultValue is false并且在稍后的某个时间,IsRequired被设定为true,产生问题(希望在部署更改之前在测试中发现)。

这种组合还有一个可能的问题:客户端可以发送具有默认值的数据,并且该数据将被毫无问题地反序列化。然后,您的服务可能会将其保存到数据库,然后尝试将其发送回数据库,这将引发异常。

话虽这么说,我认为您使用该设置是出于文档中指出的具体原因。只需注意与以下内容的潜在冲突IsRequired.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

还有其他原因说明我应该考虑忽略发出默认值是一种不好的做法吗? 的相关文章

随机推荐