我已经和WCF合作了一段时间,并且在客户端和服务器都倾向于共同发布的地方;也就是说,新版本几乎总是同时发布。互操作性和版本控制不是问题(至少在这种情况下)。
MSDN文档DataMemberAttribute.EmitDefaultValue和Data Contract Versioning表明,除非有特定需要并支持版本控制,否则发出默认值是不好的做法。
在实践中,我发现它很有用,有时候省略默认值很重要,特别是当WCF服务必须回调多个客户端时。在高负载时,较大的消息会给服务器带来很高的内存压力,并且需要更长的时间来传输。
还有其他原因可以避免这种情况吗?
答案 0 :(得分:1)
我也在某些地方使用DataMemberAttribute.EmitDefaultValue = false
来尝试限制传输的数据量。就我而言,我控制着客户端和服务器端,所以我没有任何问题。
我确实找到reference与DataMemberAttribute.IsRequired
潜在冲突,我之前不知道:
与IsRequired的互动
...如果 IsRequired 设置为 true ,(表示必须存在值)和 EmitDefaultValue 设置为 false (表示该值不得 如果设置为默认值,则存在),默认值 数据成员无法序列化,因为结果将是 矛盾。如果此类数据成员设置为其默认值 (通常为null或0)并尝试序列化,a 抛出SerializationException。
通常,这应该不是问题,因为只要您尝试使用标有EmitDefaultValue = false
,IsRequired = true
的成员和默认值序列化对象,就会得到{{1所以问题非常明显(我刚刚测试过)。但是,我可以看到SerializationExeception
为EmitDefaultValue
的情况,在稍后的某个时间,false
设置为IsRequired
,会产生问题(希望在更改之前进入测试阶段)展开)。
此组合可能还有一个问题:客户端可以使用默认值发送数据,并且这将被反序列化而不会出现问题。然后,您的服务可能会将其保存到数据库中,然后尝试将其发回,这将引发异常。
所有这一切,我认为您正在使用该设置,因为文档中提到了特定的原因。请注意与true
的潜在冲突。