还有其他原因我为什么要考虑省略发布默认值是不好的做法?

时间:2011-10-27 03:24:22

标签: .net wcf default-value datacontract

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

MSDN文档DataMemberAttribute.EmitDefaultValueData Contract Versioning表明,除非有特定需要并支持版本控制,否则发出默认值是不好的做法。

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

还有其他原因可以避免这种情况吗?

1 个答案:

答案 0 :(得分:1)

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

我确实找到referenceDataMemberAttribute.IsRequired潜在冲突,我之前不知道:

  

与IsRequired的互动

     

...如果 IsRequired 设置为    true ,(表示必须存在值)和    EmitDefaultValue 设置为 false (表示该值不得   如果设置为默认值,则存在),默认值   数据成员无法序列化,因为结果将是   矛盾。如果此类数据成员设置为其默认值   (通常为null或0)并尝试序列化,a   抛出SerializationException。

通常,这应该不是问题,因为只要您尝试使用标有EmitDefaultValue = falseIsRequired = true的成员和默认值序列化对象,就会得到{{1所以问题非常明显(我刚刚测试过)。但是,我可以看到SerializationExeceptionEmitDefaultValue的情况,在稍后的某个时间,false设置为IsRequired,会产生问题(希望在更改之前进入测试阶段)展开)。

此组合可能还有一个问题:客户端可以使用默认值发送数据,并且这将被反序列化而不会出现问题。然后,您的服务可能会将其保存到数据库中,然后尝试将其发回,这将引发异常。

所有这一切,我认为您正在使用该设置,因为文档中提到了特定的原因。请注意与true的潜在冲突。