为啥不推荐使用 [DataMember(EmitDefaultValue = false)]?
Posted
技术标签:
【中文标题】为啥不推荐使用 [DataMember(EmitDefaultValue = false)]?【英文标题】:Why is using [DataMember(EmitDefaultValue = false)] not recommended?为什么不推荐使用 [DataMember(EmitDefaultValue = false)]? 【发布时间】:2011-07-19 22:30:58 【问题描述】:在 WCF 中,您可以使用 [DataContract]
和 [DataMember]
属性定义合同,如下所示:
[DataContract]
public class Sample
[DataMember(EmitDefaultValue = false, IsRequired = false)]
public string Test get; set;
This article on the MSDN 声明不推荐使用EmitDefaultValue = false
:
但是,我喜欢使用它,因为使用这种构造生成的 XML 更干净。不指定此设置会导致:
<Sample>
<Test xsi:nil="true"/>
</Sample>
在使用设置时,如果没有值,则省略元素:
<Sample>
</Sample>
我很好奇这句话背后的原因是什么。特别是因为 XML 的两个片段看起来都和我一样(并且最后一部分都可以为这个合同正确反序列化)。
这句话背后的原因是什么?
【问题讨论】:
【参考方案1】:原因在您链接到的文章的底部。简短的版本是:
当 EmitDefaultValue
设置为 false 时,它在架构中表示为特定于 Windows Communication Foundation (WCF) 的注释。没有可互操作的方式来表示此信息。特别是,架构中的“默认”属性不用于此目的,minOccurs
属性仅受IsRequired
设置的影响,nillable
属性仅受数据成员类型的影响。
架构中不存在要使用的实际默认值。由接收端点适当解释缺失的元素。
【讨论】:
这其中的重要部分似乎是互操作问题。如果您在通话双方都使用 .net 技术和强类型数据合同,则应该不会遇到问题。以上是关于为啥不推荐使用 [DataMember(EmitDefaultValue = false)]?的主要内容,如果未能解决你的问题,请参考以下文章