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

oɔɯ*_*ɯǝɹ 32 wcf msdn datacontract datamember

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

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

MSDN上的这篇文章指出EmitDefaultValue = false不建议使用:

片段

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

<Sample>
    <Test xsi:nil="true"/>
</Sample>
Run Code Online (Sandbox Code Playgroud)

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

<Sample>
</Sample>
Run Code Online (Sandbox Code Playgroud)

我很好奇这个陈述背后的原因是什么.特别是因为XML的两个snipptes看起来都等同于我(并且最后一部分可以为此契约正确地反序列化).

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

Shi*_*iji 23

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

  • EmitDefaultValue设置为false时,它在架构中表示为特定于Windows Communication Foundation(WCF)的注释.没有可互操作的方式来表示此信息.特别是,模式中的"default"属性不用于此目的,该minOccurs属性仅受IsRequired设置的影响,并且该nillable属性仅受数据成员类型的影响.

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

  • 其中重要的部分似乎是操作间的关注.如果您在呼叫的两侧使用.net技术并且强类型数据合同,则不应该遇到问题. (6认同)