データ メンバーの既定値

.NET Framework では、型に 既定値 の概念があります。 たとえば、参照型の既定値は null で、整数型の既定値は 0 です。 しかし、データ メンバーが既定値に設定されている場合は、シリアル化されたデータからそのデータ メンバーを省略することが望ましいことがあります。 それは、メンバーが既定値に設定されているために実際の値をシリアル化する必要がなく、パフォーマンスの点で有利だからです。

シリアル化されたデータからデータ メンバーを省略するには、EmitDefaultValue 属性の DataMemberAttribute プロパティを false に設定します (既定値は true)。

注意

相互運用性の維持やデータ サイズの縮小のような特別なニーズがある場合は、EmitDefaultValue プロパティを false に設定する必要があります。

次のコードには、EmitDefaultValuefalse に設定された複数のメンバーが含まれています。

[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 の値 0 は、シリアル化されるデータに明示的に含められます。 ただし、positionsalary、および bonus のメンバーはシリアル化されません。 また、targetSalary プロパティは EmitDefaultValue に設定されていますが、57800 が .NET の整数の既定値 (0) と一致しないため、false が通常どおりにシリアル化されます。

XML 表現

前の例を XML にシリアル化すると、生成される XML 表現は次のようになります。

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

xsi:nil 属性は W3C (World Wide Web Consortium) XML スキーマ インスタンス名前空間の特別な属性であり、null 値を明示的に表すための相互運用可能な方法を提供します。 この XML には、地位、給与、ボーナスの各データ メンバーに関する情報がまったく含まれていないことに注目してください。 これらのデータ メンバーは、受信エンドポイントで、それぞれ null、0、および null として解釈します。 これらをサードパーティ製のデシリアライザーで正しく解釈できる保証はないため、このパターンはお勧めしません。 DataContractSerializer クラスを使用すると、値が指定されていない場合でも、常に正しい解釈が選択されます。

IsRequired との対話

データ コントラクトのバージョン管理」で説明されているように、DataMemberAttribute 属性には IsRequired プロパティ (既定値は false) があり ます。 このプロパティは、シリアル化されたデータを逆シリアル化する際に、指定されたデータ メンバーが存在する必要があるかどうかを示します。 IsRequiredtrue (値が存在する必要がある) に設定され、EmitDefaultValuefalse (既定値に設定されている場合は、値が存在する必要がない) に設定されている場合は、結果が矛盾するため、このデータ メンバーの既定値をシリアル化できません。 このようなデータ メンバーを既定値 (通常は null または 0) に設定してシリアル化を実行すると、SerializationException がスローされます。

スキーマ表現

EmitDefaultValue プロパティを false に設定したときのデータ メンバーの XML スキーマ定義言語 (XSD: XML Schema Definition Language) スキーマ表現の詳細については、「データ コントラクト スキーマの参照」を参照してください。 以下に、その概要を簡単に説明します。

  • EmitDefaultValuefalse に設定されている場合、スキーマでは、Windows Communication Foundation (WCF) に固有の注釈として表されます。 この情報を表すための相互運用可能な方法はありません。 特に、スキーマにおける "default" 属性はこの目的では使用されません。また、minOccurs 属性は IsRequired 設定だけに影響され、nillable 属性はデータ メンバーの型だけに影響されます。

  • 使用される実際の既定値は、スキーマには存在しません。 指定されていない要素が適切に解釈されるかどうかは、受信エンドポイントに依存します。

スキーマのインポートでは、前述の WCF 固有の注釈が検出されるたびに EmitDefaultValue プロパティが自動的に false に設定されます。 また、このプロパティは一般に、ASP.NET Web サービスの使用時に発生する特定の相互運用シナリオをサポートするために、nillable プロパティが false に設定されている参照型に対しても、false に設定されます。

関連項目