次の方法で共有


データ コントラクトの XML 型と ADO.NET 型

Windows Communication Foundation (WCF) データ コントラクト モデルでは、XML を直接表す特定の型がサポートされています。 これらの型を XML にシリアル化すると、シリアライザーはこれらの型の XML コンテンツをそれ以上処理せずに書き込みます。 サポートされている型は、 XmlElementXmlNode の配列 ( XmlNode 型自体ではなく)、および IXmlSerializableを実装する型です。 DataSet型とDataTable型、および型指定されたデータセットは、データベース プログラミングでよく使用されます。 これらの型は IXmlSerializable インターフェイスを実装するため、データ コントラクト モデルでシリアル化できます。 このトピックの最後に、これらの型に関するいくつかの特別な考慮事項を示します。

XML 型

XmlElement

XmlElement型は、その XML コンテンツを使用してシリアル化されます。 たとえば、次の型を使用します。

[DataContract(Namespace=@"http://schemas.contoso.com")]
public class MyDataContract
{
    [DataMember]
    public XmlElement myDataMember;
    public void TestClass()
    {
        XmlDocument xd = new XmlDocument();
        myDataMember = xd.CreateElement("myElement");
        myDataMember.InnerText = "myContents";
        myDataMember.SetAttribute
         ("myAttribute","myValue");
    }
}
<DataContract([Namespace]:="http://schemas.contoso.com")> _
Public Class MyDataContract
    <DataMember()> _
    Public myDataMember As XmlElement

    Public Sub TestClass()
        Dim xd As New XmlDocument()
        myDataMember = xd.CreateElement("myElement")
        myDataMember.InnerText = "myContents"
        myDataMember.SetAttribute("myAttribute", "myValue")

    End Sub
End Class

これは、次のように XML にシリアル化されます。

<MyDataContract xmlns="http://schemas.contoso.com">  
    <myDataMember>  
        <myElement xmlns="" myAttribute="myValue">  
            myContents  
        </myElement>  
    </myDataMember>  
</MyDataContract>  

ラッパー データ メンバー要素 <myDataMember> がまだ存在していることに注意してください。 データ コントラクト モデルでこの要素を削除する方法はありません。 このモデルを処理するシリアライザー ( DataContractSerializerNetDataContractSerializer) は、このラッパー要素に特別な属性を出力する場合があります。 これらの属性には、標準の XML スキーマ インスタンス "nil" 属性 ( XmlElementnullできるようにする) と "type" 属性 ( XmlElement をポリモーフィックに使用できます) が含まれます。 また、次の XML 属性は WCF に固有です:"Id"、"Ref"、"Type"、"Assembly"。 これらの属性は、オブジェクト グラフの保持モードが有効になっている XmlElement を使用するか、 NetDataContractSerializerを使用してサポートするように出力できます。 (オブジェクト グラフ保持モードの詳細については、「 シリアル化と逆シリアル化」を参照してください)。

XmlElementの配列またはコレクションは許可され、他の配列またはコレクションとして処理されます。 つまり、コレクション全体のラッパー要素と、配列内の各<myDataMember>に対して個別のラッパー要素 (前の例のXmlElementと同様) があります。

逆シリアル化では、受信 XML からデシリアライザーによって XmlElement が作成されます。 有効な親 XmlDocument は、デシリアライザーによって提供されます。

XmlElementに逆シリアル化される XML フラグメントが、使用するすべてのプレフィックスを定義し、先祖要素のプレフィックス定義に依存していないことを確認します。 これは、 DataContractSerializer を使用して別の (DataContractSerializer以外の) ソースから XML にアクセスする場合にのみ問題になります。

DataContractSerializerで使用する場合、XmlElementはポリモーフィックに割り当てることができますが、Object型のデータ メンバーにのみ割り当てることができます。 IEnumerableを実装している場合でも、XmlElementをコレクション型として使用することはできず、IEnumerable データ メンバーに割り当てることはできません。 すべてのポリモーフィックな割り当てと同様に、 DataContractSerializer は結果の XML でデータ コントラクト名を出力します。 この場合、 http://schemas.datacontract.org/2004/07/System.Xml 名前空間では "XmlElement" になります。

NetDataContractSerializerでは、(XmlElementまたはObjectへの) IEnumerableの有効なポリモーフィックな割り当てがサポートされます。

XmlElementから派生した型を持ついずれかのシリアライザーを、ポリモーフィックに割り当てられているかどうかにかかわらず、使用しようとしないでください。

XmlNode の配列

XmlNodeの配列の使用は、XmlElementの使用とよく似ています。 XmlNodeの配列を使用すると、XmlElementを使用するよりも柔軟性が高くなります。 データ メンバーラッピング要素内に複数の要素を書き込むことができます。 XML コメントなど、データ メンバーラッピング要素の内部に要素以外のコンテンツを挿入することもできます。 最後に、ラッピングデータメンバー要素に属性を設定できます。 このすべてを実現するには、XmlNodeXmlNodeXmlAttributeなどのXmlElementの特定の派生クラスをXmlCommentの配列に設定します。 たとえば、次の型を使用します。

[DataContract(Namespace="http://schemas.contoso.com")]
public class MyDataContract
{
    [DataMember]
    public XmlNode[] myDataMember = new XmlNode[4];
    public void TestClass()
    {
        XmlDocument xd = new XmlDocument();
        XmlElement xe = xd.CreateElement("myElement");
        xe.InnerText = "myContents";
        xe.SetAttribute
         ("myAttribute","myValue");
    
        XmlAttribute atr = xe.Attributes[0];
        XmlComment cmnt = xd.CreateComment("myComment");
        
      myDataMember[0] = atr;
      myDataMember[1] = cmnt;
      myDataMember[2] = xe;
      myDataMember[3] = xe;
    }
}
<DataContract([Namespace]:="http://schemas.contoso.com")> _
Public Class MyDataContract
    <DataMember()> _
    Public myDataMember(3) As XmlNode

    Public Sub TestClass()
        Dim xd As New XmlDocument()
        Dim xe As XmlElement = xd.CreateElement("myElement")
        xe.InnerText = "myContents"
        xe.SetAttribute("myAttribute", "myValue")

        Dim atr As XmlAttribute = xe.Attributes(0)
        Dim cmnt As XmlComment = xd.CreateComment("myComment")

        myDataMember(0) = atr
        myDataMember(1) = cmnt
        myDataMember(2) = xe
        myDataMember(3) = xe

    End Sub

End Class

シリアル化すると、結果の XML は次のコードのようになります。

<MyDataContract xmlns="http://schemas.contoso.com">  
  <myDataMember myAttribute="myValue">  
     <!--myComment-->  
     <myElement xmlns="" myAttribute="myValue">  
 myContents  
     </myElement>  
     <myElement xmlns="" myAttribute="myValue">  
       myContents  
     </myElement>  
  </myDataMember>  
</MyDataContract>  

データ メンバー ラッパー要素 <myDataMember> には、属性、コメント、および 2 つの要素が含まれていることに注意してください。 これらは、シリアル化された 4 つの XmlNode インスタンスです。

XML が無効になる XmlNode の配列をシリアル化できません。 たとえば、2 つの XmlNode インスタンスの配列で、最初のインスタンスが XmlElement で、2 つ目のインスタンスが XmlAttribute が無効です。これは、このシーケンスが有効な XML インスタンスに対応していないためです (属性をアタッチする場所がありません)。

XmlNodeの配列を逆シリアル化すると、ノードが作成され、受信 XML からの情報が設定されます。 有効な親 XmlDocument は、デシリアライザーによって提供されます。 ラッパー データ メンバー要素の属性を含め、すべてのノードが逆シリアル化されますが、WCF シリアライザーによって配置された属性 (ポリモーフィックな割り当てを示すために使用される属性など) は除外されます。 XML フラグメント内のすべての名前空間プレフィックスの定義に関する注意事項は、XmlNodeの逆シリアル化と同様に、XmlElementの配列の逆シリアル化にも適用されます。

オブジェクト グラフの保持が有効になっているシリアライザーを使用する場合、オブジェクトの等価性は、個々のXmlNode インスタンスではなく、XmlNode配列のレベルでのみ保持されます。

1 つ以上のノードがXmlNodeに設定されているnullの配列をシリアル化しないでください。 配列メンバー全体を nullできますが、配列に含まれる個々の XmlNode に対しては許可されません。 配列メンバー全体が null の場合、ラッパー データ メンバー要素には、null であることを示す特別な属性が含まれます。 逆シリアル化の場合、配列メンバー全体も null になります。

シリアライザーによって特別に扱われるのは、 XmlNode の通常の配列だけです。 XmlNodeを含む他のコレクション型として宣言されたデータ メンバー、またはXmlNodeから派生した型の配列として宣言されたデータ メンバーは、特別に扱われません。 したがって、シリアル化の他の条件の 1 つを満たさない限り、通常はシリアル化できません。

XmlNodeの配列または配列のコレクションを使用できます。 コレクション全体のラッパー要素と、外側の配列またはコレクション内の<myDataMember>の配列ごとに個別のラッパー要素 (前の例のXmlNodeと同様) があります。

ArrayObject または ArrayIEnumerable 型のデータ メンバーに XmlNode インスタンスを設定しても、そのデータ メンバーは Array インスタンスの XmlNode として認識されるわけではありません。 各配列メンバーは個別にシリアル化されます。

DataContractSerializerで使用する場合、XmlNodeの配列はポリモーフィックに割り当てることができますが、Object型のデータ メンバーにのみ割り当てることができます。 IEnumerableを実装していても、XmlNodeの配列をコレクション型として使用したり、IEnumerableデータ メンバーに割り当てたりすることはできません。 すべてのポリモーフィックな割り当てと同様に、 DataContractSerializer は結果の XML でデータ コントラクト名を出力します。この場合は、 http://schemas.datacontract.org/2004/07/System.Xml 名前空間の "ArrayOfXmlNode" になります。 NetDataContractSerializerで使用すると、XmlNode配列の有効な割り当てがサポートされます。

スキーマに関する考慮事項

XML 型のスキーマ マッピングの詳細については、「 データ コントラクト スキーマ リファレンス」を参照してください。 このセクションでは、重要な点の概要を示します。

XmlElement型のデータ メンバーは、次の匿名型を使用して定義された要素にマップされます。

<xsd:complexType>  
   <xsd:sequence>  
      <xsd:any minOccurs="0" processContents="lax" />  
   </xsd:sequence>  
</xsd:complexType>  

XmlNodeの配列型のデータ メンバーは、次の匿名型を使用して定義された要素にマップされます。

<xsd:complexType mixed="true">  
   <xsd:sequence>  
      <xsd:any minOccurs="0" maxOccurs="unbounded" processContents="lax" />  
   </xsd:sequence>  
   <xsd:anyAttribute/>  
</xsd:complexType>  

IXmlSerializable インターフェイスを実装する型

IXmlSerializable インターフェイスを実装する型は、DataContractSerializerで完全にサポートされます。 スキーマを制御するには、 XmlSchemaProviderAttribute 属性を常にこれらの型に適用する必要があります。

IXmlSerializableを実装する型には、任意のコンテンツを表す型、1 つの要素を表す型、レガシ DataSet型の 3 種類があります。

  • コンテンツ タイプは、 XmlSchemaProviderAttribute 属性で指定されたスキーマ プロバイダー メソッドを使用します。 このメソッドは nullを返しません。属性の IsAny プロパティは既定値の false のままにします。 これは、 IXmlSerializable 型の最も一般的な使用方法です。

  • 要素型は、 IXmlSerializable 型が独自のルート要素名を制御する必要がある場合に使用されます。 型を要素型としてマークするには、IsAny属性のXmlSchemaProviderAttribute プロパティをtrueに設定するか、スキーマ プロバイダー メソッドから null を返します。 スキーマ プロバイダー メソッドを持つことは、要素型では省略可能です。 XmlSchemaProviderAttributeでメソッド名の代わりに null を指定できます。 ただし、 IsAnytrue で、スキーマ プロバイダー メソッドが指定されている場合、メソッドは null を返す必要があります。

  • 従来のDataSet型は、IXmlSerializable属性でマークされていないXmlSchemaProviderAttribute型です。 代わりに、スキーマ生成に GetSchema メソッドを使用します。 このパターンは DataSet 型に使用され、型指定されたデータセットは以前のバージョンの .NET Framework でクラスを派生させますが、現在は廃止され、従来の理由でのみサポートされています。 このパターンに依存せず、常に XmlSchemaProviderAttributeIXmlSerializable 型に適用してください。

IXmlSerializable コンテンツ型

IXmlSerializableを実装し、前に定義したコンテンツ タイプである型のデータ メンバーをシリアル化する場合、シリアライザーはデータ メンバーのラッパー要素を書き込み、WriteXml メソッドに制御を渡します。 WriteXml実装では、ラッパー要素に属性を追加するなど、任意の XML を書き込むことができます。 WriteXmlが完了すると、シリアライザーは要素を閉じます。

IXmlSerializableを実装し、前に定義したコンテンツ タイプである型のデータ メンバーを逆シリアル化する場合、デシリアライザーはデータ メンバーのラッパー要素に XML リーダーを配置し、ReadXml メソッドに制御を渡します。 メソッドは、開始タグと終了タグを含む要素全体を読み取る必要があります。 ReadXmlコードが要素が空の場合を処理していることを確認します。 さらに、 ReadXml 実装は、特定の方法で名前が付けられているラッパー要素に依存しないようにする必要があります。 シリアライザーによって選択される名前は異なる場合があります。

たとえば、IXmlSerializable 型のデータ メンバーにObjectコンテンツ タイプをポリモーフィックに割り当てることができます。 また、型インスタンスが null になることも許可されます。 最後に、オブジェクト グラフの保持を有効にし、IXmlSerializableを使用して、NetDataContractSerializer型を使用できます。 これらすべての機能では、WCF シリアライザーが特定の属性をラッパー要素にアタッチする必要があります (XML スキーマ インスタンス名前空間では "nil" と "type"、WCF 固有の名前空間では "Id"、"Ref"、"Type"、"Assembly")。

ReadXml を実装するときに無視する属性

ReadXml コードに制御を渡す前に、デシリアライザーは XML 要素を調べ、これらの特殊な XML 属性を検出し、それらに対して動作します。 たとえば、"nil" が true場合、null 値は逆シリアル化され、 ReadXml は呼び出されません。 ポリモーフィズムが検出された場合、要素の内容は別の型であるかのように逆シリアル化されます。 ポリモーフィックに割り当てられた型の ReadXml の実装が呼び出されます。 いずれの場合も、 ReadXml 実装では、これらの特殊な属性はデシリアライザーによって処理されるため、無視する必要があります。

IXmlSerializable コンテンツタイプにおけるスキーマの考慮事項

スキーマを IXmlSerializable コンテンツ タイプにエクスポートすると、スキーマ プロバイダー メソッドが呼び出されます。 XmlSchemaSetはスキーマ プロバイダー メソッドに渡されます。 このメソッドは、任意の有効なスキーマをスキーマ セットに追加できます。 スキーマ セットには、スキーマのエクスポートが行われる時点で既に認識されているスキーマが含まれています。 スキーマ プロバイダー メソッドがスキーマ セットに項目を追加する必要がある場合は、適切な名前空間を持つ XmlSchema が既にセットに存在するかどうかを判断する必要があります。 その場合、スキーマ プロバイダー メソッドは、既存の XmlSchemaに新しい項目を追加する必要があります。 それ以外の場合は、新しい XmlSchema インスタンスを作成する必要があります。 これは、 IXmlSerializable 型の配列が使用されている場合に重要です。 たとえば、名前空間 "B" で型 "A" としてエクスポートされる IXmlSerializable 型がある場合、スキーマ プロバイダー メソッドが呼び出される時点で、スキーマ セットに "ArrayOfA" 型を保持する "B" のスキーマが既に含まれている可能性があります。

コンテンツ タイプのスキーマ プロバイダー メソッドは、 XmlSchemaSetに型を追加するだけでなく、null 以外の値を返す必要があります。 指定したXmlQualifiedName型に使用するスキーマ型の名前を指定するIXmlSerializableを返すことができます。 この修飾名は、型のデータ コントラクト名と名前空間としても機能します。 スキーマ プロバイダー メソッドから戻るとすぐに、スキーマ セットに存在しない型を返すことが許可されています。 ただし、関連するすべての型がエクスポートされる (Exportのすべての関連する型に対して XsdDataContractExporter メソッドが呼び出され、Schemas プロパティにアクセスされる) までに、その型がスキーマ セットに存在することが予想されます。 関連するすべてのSchemas呼び出しが行われる前に Export プロパティにアクセスすると、XmlSchemaExceptionが発生する可能性があります。 エクスポート プロセスの詳細については、「 クラスからのスキーマのエクスポート」を参照してください。

スキーマ プロバイダー メソッドは、使用する XmlSchemaType を返すこともできます。 型は匿名である場合とそうでない場合があります。 匿名の場合、IXmlSerializable型がデータ メンバーとして使用されるたびに、IXmlSerializable型のスキーマが匿名型としてエクスポートされます。 IXmlSerializable型には、引き続きデータ コントラクト名と名前空間があります。 (これは、「 データ コントラクト名 」の説明に従って決定されます。ただし、 DataContractAttribute 属性を使用して名前をカスタマイズすることはできません)。匿名でない場合は、 XmlSchemaSetのいずれかの型である必要があります。 このケースは、型の XmlQualifiedName を返すのと同じです。

さらに、型のグローバル要素宣言がエクスポートされます。 型に XmlRootAttribute 属性が適用されていない場合、要素の名前と名前空間はデータ コントラクトと同じになり、"nillable" プロパティは true。 これに対する唯一の例外はスキーマ名前空間 (http://www.w3.org/2001/XMLSchema) です。型のデータ コントラクトがこの名前空間にある場合、対応するグローバル要素は、スキーマ名前空間に新しい要素を追加することは禁止されているため、空白の名前空間にあります。 型に XmlRootAttribute 属性が適用されている場合、グローバル要素宣言は、 ElementNameNamespace、および IsNullableのプロパティを使用してエクスポートされます。 XmlRootAttributeが適用される既定値は、データ コントラクト名、空白の名前空間、および "nillable" が true です。

同じグローバル要素宣言規則が、レガシ データセット型に適用されます。 XmlRootAttributeは、カスタム コードを介して、スキーマプロバイダーメソッドでXmlSchemaSetに追加されたり、レガシーデータセット型のGetSchemaを通じて追加されたりしたグローバル要素宣言をオーバーライドすることはできないことに注意してください。

IXmlSerializable 要素型

IXmlSerializable 要素型には、 IsAny プロパティが true に設定されているか、スキーマ プロバイダー メソッドから nullが返されます。

要素型のシリアル化と逆シリアル化は、コンテンツ タイプのシリアル化と逆シリアル化とよく似ています。 ただし、いくつかの重要な違いがあります。

  • WriteXml実装では、1 つの要素 (もちろん複数の子要素を含む可能性があります) を記述することが想定されています。 この 1 つの要素、複数の兄弟要素、または混合コンテンツの外部に属性を書き込むべきではありません。 要素が空の場合があります。

  • ReadXml実装では、ラッパー要素を読み取らてはなりません。 WriteXml生成される 1 つの要素を読み取ることが期待されます。

  • 要素型を定期的にシリアル化する場合 (データ コントラクトのデータ メンバーなど)、シリアライザーは、コンテンツ タイプと同様に、 WriteXmlを呼び出す前にラッパー要素を出力します。 ただし、最上位レベルで要素型をシリアル化する場合、WriteXmlまたはDataContractSerializerコンストラクターでシリアライザーを構築するときにルート名と名前空間が明示的に指定されていない限り、シリアライザーは通常、書き込みNetDataContractSerializer要素の周囲にラッパー要素を出力しません。 詳細については、「 シリアル化と逆シリアル化」を参照してください。

  • 構築時にルート名と名前空間を指定せずに最上位レベルで要素型をシリアル化する場合、 WriteStartObjectWriteEndObject は基本的に何も行わず、 WriteObjectContent 呼び出し WriteXml。 このモードでは、シリアル化されるオブジェクトを null にすることはできません。また、ポリモーフィックに割り当てることはできません。 また、オブジェクト グラフの保持を有効にできず、 NetDataContractSerializer を使用できません。

  • 構築時にルート名と名前空間を指定せずに最上位レベルで要素型を逆シリアル化すると、 IsStartObject は要素の先頭が見つかると true を返します。 ReadObjectverifyObjectNameパラメーターを true に設定すると、実際にオブジェクトを読み取る前のIsStartObjectと同じように動作します。 ReadObject 次に、 ReadXml メソッドに制御を渡します。

要素の種類に対してエクスポートされるスキーマは、前のセクションで説明した XmlElement 型の場合と同じですが、スキーマ プロバイダー メソッドはコンテンツ タイプと同様に、 XmlSchemaSet にスキーマを追加できます。 要素型で XmlRootAttribute 属性を使用することは許可されず、これらの型に対してグローバル要素宣言は生成されません。

XmlSerializer との違い

IXmlSerializable インターフェイスとXmlSchemaProviderAttribute属性とXmlRootAttribute属性も、XmlSerializerによって認識されます。 ただし、データ コントラクト モデルでのこれらの処理方法にはいくつかの違いがあります。 重要な違いを次にまとめます。

  • スキーマ プロバイダー メソッドは、 XmlSerializerで使用できるようにするには public である必要がありますが、データ コントラクト モデルで使用できるパブリックである必要はありません。

  • スキーマ プロバイダー メソッドは、データ コントラクト モデルで IsAny が true の場合に呼び出されますが、 XmlSerializerでは呼び出されません。

  • コンテンツまたはレガシ データセット型に対して XmlRootAttribute 属性が存在しない場合、 XmlSerializer は空白の名前空間にグローバル要素宣言をエクスポートします。 データ コントラクト モデルでは、使用される名前空間は、通常、前に説明したようにデータ コントラクト名前空間です。

両方のシリアル化テクノロジで使用される型を作成する場合は、これらの違いに注意してください。

IXmlSerializable スキーマのインポート

IXmlSerializable型から生成されたスキーマをインポートする場合、いくつかの可能性があります。

  • 生成されたスキーマは、「データ コントラクト スキーマ リファレンス」の説明に従って、有効な データ コントラクト スキーマである可能性があります。 この場合、スキーマは通常どおりインポートでき、通常のデータ コントラクト型が生成されます。

  • 生成されたスキーマは、有効なデータ コントラクト スキーマではない可能性があります。 たとえば、スキーマ プロバイダー メソッドでは、データ コントラクト モデルでサポートされていない XML 属性を含むスキーマを生成できます。 この場合、スキーマを IXmlSerializable 型としてインポートできます。 このインポート モードは既定ではオンになっていませんが、簡単に有効にすることができます。たとえば、 /importXmlTypes コマンド ライン スイッチを ServiceModel メタデータ ユーティリティ ツール (Svcutil.exe) に切り替えます。 詳細については、「 スキーマをインポートしてクラスを生成する」を参照してください。 型インスタンスの XML を直接操作する必要があることに注意してください。 また、より広範なスキーマをサポートする別のシリアル化テクノロジの使用を検討することもできます。 XmlSerializerの使用に関するトピックを参照してください。

  • 新しい型を生成する代わりに、プロキシで既存の IXmlSerializable 型を再利用できます。 この場合、「型を生成するスキーマのインポート」トピックで説明されている参照型機能を使用して、再利用する型を示すことができます。 これは、再利用する型を含むアセンブリを指定する、svcutil.exeでの /reference スイッチの使用に対応します。

データ コントラクトでの任意の XML の表し

XmlElementXmlNodeの配列、およびIXmlSerializable型を使用すると、データ コントラクト モデルに任意の XML を挿入できます。 DataContractSerializerNetDataContractSerializerは、プロセスを妨げることなく、使用中の XML ライターにこの XML コンテンツを渡します。 ただし、XML ライターは、書き込む XML に特定の制限を適用する場合があります。 具体的には、いくつかの重要な例を次に示します。

  • XML ライターでは、通常、別のドキュメントの書き込み中に XML ドキュメント宣言 (たとえば、 <?xml version='1.0' ?>) は許可されません。 完全な XML ドキュメントを取得して、データ メンバーの ArrayXmlNode としてシリアル化することはできません。 これを行うには、ドキュメント宣言を取り除くか、独自のエンコード スキームを使用してそれを表す必要があります。

  • WCF に付属するすべての XML ライターは、SOAP メッセージでは使用できないため、XML 処理命令 (<? ...?>) とドキュメント型定義 (<! ... >) を拒否します。 ここでも、独自のエンコード メカニズムを使用して、この制限を回避できます。 これらを結果の XML に含める必要がある場合は、それらをサポートする XML ライターを使用するカスタム エンコーダーを記述できます。

  • WriteXmlを実装するときは、XML ライターWriteRawメソッドを呼び出さないようにします。 WCF ではさまざまな XML エンコード (バイナリを含む) を使用します。結果が任意のエンコードで使用できるように、 WriteRaw を使用することは非常に困難または不可能です。

  • WriteXmlを実装する場合は、WCF で提供される XML ライターでサポートされていないWriteEntityRefメソッドとWriteNmTokenメソッドを使用しないでください。

DataSet、Typed DataSet、および DataTable の使用

これらの型の使用は、データ コントラクト モデルで完全にサポートされています。 これらの型を使用する場合は、次の点を考慮してください。

  • これらの型のスキーマ (特に DataSet とその型指定された派生クラス) は、一部の WCF 以外のプラットフォームと相互運用できない場合や、これらのプラットフォームで使用すると使いやすさが低下する可能性があります。 さらに、 DataSet 型を使用すると、パフォーマンスに影響する可能性があります。 最後に、将来アプリケーションのバージョンを変更することが難しくなる可能性があります。 コントラクトで DataSet 型ではなく、明示的に定義されたデータ コントラクト型を使用することを検討してください。

  • DataSetまたはDataTableスキーマをインポートするときは、これらの型を参照することが重要です。 Svcutil.exe コマンド ライン ツールを使用すると、System.Data.dll アセンブリ名を /reference スイッチに渡すことで実現できます。 型指定されたデータセット スキーマをインポートする場合は、型指定されたデータセットの型を参照する必要があります。 Svcutil.exeを使用して、型指定されたデータセットのアセンブリの場所を /reference スイッチに渡します。 型の参照の詳細については、「 スキーマをインポートしてクラスを生成する」を参照してください。

データ コントラクト モデルでの型指定された DataSet のサポートは制限されています。 型指定された DataSet はシリアル化および逆シリアル化でき、スキーマをエクスポートできます。 ただし、データ コントラクト スキーマのインポートでは、スキーマから新しい型指定された DataSet 型を生成できません。これは、既存の DataSet 型のみを再利用できるためです。 /rスイッチを使用して、Svcutil.exeにある既存の型指定された DataSet を指すことができます。 型指定されたデータセットを使用するサービスで /r スイッチなしで Svcutil.exe を使用しようとすると、代替シリアライザー (XmlSerializer) が自動的に選択されます。 DataContractSerializer を使用する必要があり、スキーマから DataSet を生成する必要がある場合は、次の手順を使用できます。型指定された DataSet 型を生成します (サービスの /d スイッチで Xsd.exe ツールを使用して)、型をコンパイルしてから、Svcutil.exeの /r スイッチを使用してそれらをポイントします。

こちらも参照ください