次の方法で共有


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

既定では、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"></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 をデータ メンバーに適用すると、そのメンバーは、ラウンド トリップ時に "参照可能" として認識され続けます。

関連項目