既定では、 DataContractSerializer は値によってオブジェクトをシリアル化します。 IsReference プロパティを使用して、オブジェクトをシリアル化するときにオブジェクト参照を保持するようにデータ コントラクト シリアライザーに指示できます。
生成された XML
例として、次のオブジェクトを考えてみましょう。
[DataContract]
public class X
{
SomeClass someInstance = new SomeClass();
[DataMember]
public SomeClass A = someInstance;
[DataMember]
public SomeClass B = someInstance;
}
public class SomeClass
{
}
PreserveObjectReferences
false
(既定値) に設定すると、次の XML が生成されます。
<X>
<A>contents of someInstance</A>
<B>contents of someInstance</B>
</X>
PreserveObjectReferencesを true
に設定すると、次の XML が生成されます。
<X>
<A id="1">contents of someInstance</A>
<B ref="1"></B>
</X>
ただし、XsdDataContractExporterでは、id
プロパティが ref
に設定されている場合でも、スキーマ内のpreserveObjectReferences
属性とtrue
属性は記述されません。
IsReference の使用
記述するスキーマに従って有効なオブジェクト参照情報を生成するには、 DataContractAttribute 属性を型に適用し、 IsReference フラグを true
に設定します。 次の例では、X
を追加して、前の例のクラス IsReference
を変更します。
[DataContract(IsReference=true)]
public class X
{
SomeClass someInstance = new SomeClass();
[DataMember]
public SomeClass A = someInstance;
[DataMember]
public SomeClass B = someInstance;
}
public class SomeClass
{
}
生成される XML は次のとおりです。
<X>
<A id="1">
<Value>contents of A</Value>
</A>
<B ref="1"></B>
</X>
IsReference
を使用すると、メッセージのラウンドトリップに対するコンプライアンスが確保されます。 これを使用しない場合、スキーマから型が生成されるときに、その型の XML 出力は、最初に想定されていたスキーマと互換性があるとは限りません。 つまり、 id
属性と ref
属性はシリアル化されましたが、元のスキーマによって、XML でこれらの属性 (またはすべての属性) が発生しないようにする可能性があります。
IsReference
データ メンバーに適用されると、メンバーはラウンドトリップ時に引き続き参照可能として認識されます。