既定では、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" />
</X>
ただし、preserveObjectReferences プロパティが true に設定されている場合でも、XsdDataContractExporter がそのスキーマに id
属性や ref
属性を記述することはありません。
IsReference の使用
スキーマの記述に従った有効なオブジェクト参照情報を生成するには、DataContractAttribute 属性を型に適用し、IsReference フラグを true に設定します。前のサンプル クラス X
で IsReference を使用するには、次のようにします。
public class X
{
SomeClass someInstance = new SomeClass();
[DataMember(IsReference=true)]
public SomeClass A = someInstance;
[DataMember(IsReference=true)]
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
属性がシリアル化されたとしても、元のスキーマによってこれらの属性 (またはすべての属性) が拒否される可能性があります。IsReference をデータ メンバーに適用すれば、そのメンバーは、ラウンド トリップ時にも "参照可能" として認識され続けます。
参照
リファレンス
DataContractAttribute
CollectionDataContractAttribute
IsReference
IsReference