在 .NET Framework 中,类型具有 默认值的概念。 例如,对于任何引用类型,默认值为 null
,对于整数类型,默认值为零。 在将数据设置为其默认值时,偶尔需要从序列化数据中省略数据成员。 由于成员具有默认值,因此不需要序列化实际值;这具有性能优势。
若要省略序列化数据中的成员,请将 EmitDefaultValue 属性的属性 DataMemberAttribute 设置为 false
(默认值为 true
)。
注释
如果确有需要,比如为了互操作性或减少数据大小,应将EmitDefaultValue属性设置为false
。
示例:
下面的代码中,有几个成员的 EmitDefaultValue 设置为 false
。
[DataContract]
public class Employee
{
[DataMember]
public string employeeName = null;
[DataMember]
public int employeeID = 0;
[DataMember(EmitDefaultValue = false)]
public string position = null;
[DataMember(EmitDefaultValue = false)]
public int salary = 0;
[DataMember(EmitDefaultValue = false)]
public int? bonus = null;
[DataMember(EmitDefaultValue = false)]
public int targetSalary = 57800;
}
<DataContract()> _
Public Class Employee
<DataMember()> _
Public employeeName As String = Nothing
<DataMember()> _
Public employeeID As Integer = 0
<DataMember(EmitDefaultValue:=False)> _
Public position As String = Nothing
<DataMember(EmitDefaultValue:=False)> _
Public salary As Integer = 0
<DataMember(EmitDefaultValue:=False)> _
Public Bonus As Integer = Bonus OrElse Nothing
<DataMember(EmitDefaultValue:=False)> _
Public targetSalary As Integer = 57800
End Class
如果序列化此类的实例,则结果如下所示: employeeName
并 employeeID
序列化。 的 null 值 employeeName
和零值 employeeID
是序列化数据的显式一部分。 但是,position
、salary
和 bonus
成员不会被序列化。 最后,即使属性 targetSalary
被设置为 EmitDefaultValue,false
仍然会照常序列化,因为 57800 不等于整数的 .NET 默认值零。
XML 表示形式
如果前面的示例序列化为 XML,则表示形式类似于以下内容。
<Employee>
<employeeName xsi:nil="true" />
<employeeID>0</employeeID>
<targetSalary>57800</targetSalary>
</Employee>
该 xsi:nil
属性是万维网联盟 (W3C) XML 架构实例命名空间中的一个特殊属性,它提供一种可互作的方式来显式表示 null 值。 请注意,XML 中根本没有有关职位、工资和奖金数据成员的信息。 接收端可以分别将这些值解释为 null
零和 null
。 不能保证第三方反序列化程序可以做出正确的解释,这就是为什么不建议使用此模式的原因。 该 DataContractSerializer 类始终为缺失值选择正确的解释。
与 IsRequired 的交互
如 数据协定版本控制中所述,属性 DataMemberAttribute 具有属性 IsRequired (默认值为 false
)。 该属性指示在反序列化数据时给定数据成员是否必须存在于序列化数据中。 如果 IsRequired
设置为 true
(指示值必须存在),并且 EmitDefaultValue设置为 false
(指示如果设置为默认值时值必须不存在),则无法对该数据成员的默认值进行序列化,因为结果将是矛盾的。 如果此类数据成员设置为其默认值(通常为null
或零),并且尝试序列化,则会引发SerializationException。
架构表示形式
在EmitDefaultValue
中讨论当false
属性被设置为时,数据成员的 XML 架构定义语言(XSD)架构表示形式的详细信息。 但是,下面是简要概述:
当EmitDefaultValue被设置为
false
时,它在架构中表示为专用于Windows通信基础(WCF)的注释。 没有可互作的方式来表示此信息。 具体而言,架构中的“default”属性不用于此目的,该minOccurs
属性仅受 IsRequired 设置影响,并且nillable
该属性仅受数据成员类型的影响。要使用的实际默认值不在架构中。 由接收端点适当地理解缺失的元素。
在架构导入时,每当检测到前面提到的特定于 WCF 的批注时,EmitDefaultValue 属性都会自动设置为 false
。 它也被设置为 false
,对于那些将 nillable
属性设置为 false
的引用类型,以支持使用 ASP.NET Web 服务时通常出现的特定互操作性场景。