共用方式為


數據成員預設值

在 .NET Framework 中,類型具有 預設值的概念。 例如,對於任何參考型別,預設值為 null,而整數類型則為零。 當串行化數據設定為預設值時,偶爾會省略串行化數據中的數據成員。 因為成員有預設值,因此不需要串行化實際值;這具有效能優勢。

若要省略串行化數據的成員,請將 屬性的 EmitDefaultValue 屬性設定DataMemberAttributefalse (預設值為 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 的空值和 employeeID 的零值是串行化數據中的明確一部分。 不過,positionsalarybonus 成員都不會被序列化。 最後,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 Communication Foundation(WCF)的註解。 沒有可互通的方式來表示這項資訊。 特別是,架構中的 「default」 屬性不會用於此目的, minOccurs 屬性只會受到 IsRequired 設定的影響,而且 nillable 屬性只會受到數據成員的類型影響。

  • 要使用的實際預設值不存在於架構中。 這取決於接收端點來適當地解譯缺失的元素。

在架構匯入時,每當偵測到先前提及的 WCF 特定批注時, EmitDefaultValue 屬性就會自動設定為 false 。 參考類型若將屬性設定為 false,則也會設為 nillable,以支持在取用 ASP.NET Web 服務時經常發生的特定互操作性情境。

另請參閱