資料成員預設值

在 .NET Framework 中,類型內含有預設值的概念。 例如,任何參考型別的預設值為 null,整數型別則為零。 有時候資料成員設為預設值時,會需要從序列化資料中省略該成員。 因為此成員為預設值,而實際值不需要序列化,因此這樣做可促進效能。

若要省略序列化資料中的成員,請將 EmitDefaultValue 屬性 (Attribute) 的 DataMemberAttribute 屬性 (Property) 設為 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

如果這個類別的執行個體已序列化,則結果可能如下:employeeNameemployeeID 將會序列化。 employeeName 的 null 值和 employeeID 的零值將明確成為序列化資料的一部分。 不過,positionsalarybonus 成員都不會序列化。 最後,即使 targetSalary 屬性設為 EmitDefaultValuefalse 通常仍會序列化,因為 57800 不符合 .NET 預設的整數值,也就是零。

XML 表示

如果之前的範例已序列化為 XML,則表示方式將類似以下內容:

<Employee>  
   <employeeName xsi:nil="true" />  
   <employeeID>0</employeeID>  
<targetSalary>57800</targetSalary>  
</Employee>  

xsi:nil 屬性 (Attribute) 是全球資訊網協會 (W3C) XML 結構描述執行個體命名空間中的特殊屬性,會提供可互通的方式明確表示 null 值。 請注意,XML 中沒有任何關於職位、薪資及獎金資料成員的資訊。 接收端可以分別將這些成員解譯為 null、零和 null。 不過不保證協力廠商的還原序列化程式能夠正確解譯,這也是不建議使用此模式的原因。 DataContractSerializer 類別永遠會為遺漏的值選取正確解譯。

與 IsRequired 互動

資料合約版本控制所討論,DataMemberAttribute 屬性 (Attribute) 具有 IsRequired 屬性 (Property) (預設值為 false)。 這個屬性會表示還原序列化指定的資料成員時,是否必須以序列化的資料表示該成員。 如果 IsRequired 設為 true (表示一定要使用一個值),且 EmitDefaultValue 設為 false (表示如果使用預設值,則不需要使用該值),因為結果會互相矛盾,所以無法序列化此資料成員的預設值。 如果這類資料成員設為其預設值 (通常為 null 或零),並且嘗試進行序列化,則會擲回 SerializationException

結構描述表示

EmitDefaultValue 屬性設為 false 時,資料成員的 XML 結構描述定義語言 (XSD) 結構描述表示的詳細資訊將在資料合約結構描述參考中討論。 不過,以下提供簡要的概觀。

  • EmitDefaultValue 設為 false 時,會以如同 Windows Communication Foundation (WCF) 專屬附註的結構描述表示。 目前沒有可互通的方式能表示這項資訊。 特別是結構描述中的 "default" 屬性 (Attribute) 不是用於此目的時,minOccurs 屬性只會受到 IsRequired 設定的影響,而 nillable 屬性只會受到資料成員的型別影響。

  • 實際使用的預設值不會在結構描述中表示。 端看接收端點如何適當地解譯遺失的項目而定。

在結構描述匯入時,無論偵測到之前提到的 WCF 專屬附註的時機為何,EmitDefaultValue 屬性都會自動設為 false。 針對 false 屬性設為 nillable 的參考型別,此屬性也會設為 false,以支援常在使用 ASP.NET Web 服務時發生的特定互通性案例。

另請參閱