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