在 WCF 中,您可以使用 [DataContract]
定义契约(Contract)。和 [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 的两个片段看起来都和我一样(并且最后一部分都可以为这个契约(Contract)正确反序列化)。
这种说法背后的原因是什么?
最佳答案
原因在您链接到的文章的底部。简短的版本是:
EmitDefaultValue
设置为 false,它在架构中表示为特定于 Windows Communication Foundation (WCF) 的注释。没有可互操作的方式来表示此信息。特别是,架构中的“默认”属性不用于此目的,minOccurs
属性仅受 IsRequired
影响设置和 nillable
属性仅受数据成员类型的影响。 关于wcf - 为什么不推荐使用 [DataMember(EmitDefaultValue = false)]?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5382402/