为啥不推荐使用 [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)]?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 WPF 支持绑定到对象的属性,但不支持绑定字段?

DataContract,默认 DataMember 值

不需要 DataContract 和 DataMember

WCF:公开只读 DataMember 属性而不设置?

为啥 DataMemberAttribute 需要对布尔属性进行特殊处理

为啥不推荐使用 (javax.servlet.)SingleThreadModel?