.NET Framework では、型には 既定値の概念があります。 たとえば、任意の参照型の既定値は null
、整数型の場合は 0 です。 データ メンバーが既定値に設定されている場合は、シリアル化されたデータからデータ メンバーを省略することが望ましい場合があります。 メンバーには既定値があるため、実際の値をシリアル化する必要はありません。これにはパフォーマンス上の利点があります。
シリアル化されたデータからメンバーを省略するには、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
がシリアル化されます。
employeeName
の null 値と、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
属性は、World Wide Web Consortium (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
に設定されます。 また、このプロパティは一般に、ASP.NET Web サービスの使用時に発生する特定の相互運用シナリオをサポートするために、false
プロパティが nillable
に設定されている参照型に対しても、false
に設定されます。