32

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

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

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

片段

但是,我喜欢使用它,因为使用这种构造生成的 XML 更干净。不指定此设置会导致:

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

在使用设置时,当没有值时元素被省略:

<Sample>
</Sample>

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

这种说法背后的原因是什么?

4

1 回答 1

23

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

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

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

于 2011-03-21T19:21:09.910 回答