次の方法で共有


相互運用可能なオブジェクト参照

既定では、DataContractSerializer はオブジェクトを値でシリアル化します。IsReference プロパティを使用すると、型のオブジェクトをシリアル化する場合に、オブジェクト参照を保持するようにデータ コントラクト シリアライザーに指示できます。

生成される XML

例として、次のオブジェクトを考えます。

[DataContract]
public class X
{
    SomeClass someInstance = new SomeClass();
    [DataMember]
    public SomeClass A = someInstance;
    [DataMember]
    public SomeClass B = someInstance;
}

public class SomeClass 
{
}

PreserveObjectReferencesfalse (既定値) に設定すると、次の XML が生成されます。

<X>
   <A>contents of someInstance</A>
   <B>contents of someInstance</B>
</X>

PreserveObjectReferencestrue に設定すると、次の XML が生成されます。

<X>
   <A id="1">contents of someInstance</A>
   <B ref="1" />
</X>

ただし、preserveObjectReferences プロパティが true に設定されている場合でも、XsdDataContractExporter がそのスキーマに id 属性や ref 属性を記述することはありません。

IsReference の使用

スキーマの記述に従った有効なオブジェクト参照情報を生成するには、DataContractAttribute 属性を型に適用し、IsReference フラグを true に設定します。前のサンプル クラス XIsReference を使用するには、次のようにします。

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