为什么不建议使用[DataMember(EmitDefaultValue = false)]?

时间:2011-03-21 19:08:26

标签: wcf msdn datacontract datamember

在WCF中,您可以使用[DataContract][DataMember]属性定义合同,如下所示:

[DataContract]
public class Sample 
{
    [DataMember(EmitDefaultValue = false, IsRequired = false)]
    public string Test { get; set; }
}

This article on the MSDN声明不建议使用EmitDefaultValue = false

snippet

但是,我喜欢使用它,因为使用这种结构生成的XML更清晰。未指定此设置会导致:

<Sample>
    <Test xsi:nil="true"/>
</Sample>

使用设置时,如果没有值,则省略元素:

<Sample>
</Sample>

我很好奇这句话背后的原因是什么。特别是因为XML的两个snipptes看起来都与我相同(并且最后一部分可以为此合同正确地反序列化)。

这句话背后的原因是什么?

1 个答案:

答案 0 :(得分:22)

原因在于您链接到的文章的底部。简短版本是:

  • EmitDefaultValue设置为false时,它在架构中表示为特定于Windows Communication Foundation(WCF)的注释。没有可互操作的方式来表示此信息。特别是,架构中的“默认”属性不用于此目的,minOccurs属性仅受IsRequired设置的影响,nillable属性仅受到{{1}}属性的影响数据成员的类型。

  • 架构中不存在要使用的实际默认值。由接收端点来正确解释缺失的元素。