次の方法で共有


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

既定では、 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>  

PreserveObjectReferencestrue に設定すると、次の 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データ メンバーに適用されると、メンバーはラウンドトリップ時に引き続き参照可能として認識されます。

こちらも参照ください