Windows Communication Foundation (WCF) データ コントラクト モデルでは、XML を直接表す特定の型がサポートされています。 これらの型を XML にシリアル化すると、シリアライザーはこれらの型の XML コンテンツをそれ以上処理せずに書き込みます。 サポートされている型は、 XmlElement、 XmlNode の配列 ( 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>
がまだ存在していることに注意してください。 データ コントラクト モデルでこの要素を削除する方法はありません。 このモデルを処理するシリアライザー ( DataContractSerializer と NetDataContractSerializer) は、このラッパー要素に特別な属性を出力する場合があります。 これらの属性には、標準の XML スキーマ インスタンス "nil" 属性 ( XmlElement
を null
できるようにする) と "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 コメントなど、データ メンバーラッピング要素の内部に要素以外のコンテンツを挿入することもできます。 最後に、ラッピングデータメンバー要素に属性を設定できます。 このすべてを実現するには、XmlNode
、XmlNode
、XmlAttributeなどの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
と同様) があります。
Array の Object
または Array
の IEnumerable
型のデータ メンバーに 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 を指定できます。 ただし、IsAny
がtrue
で、スキーマ プロバイダー メソッドが指定されている場合、メソッドは null を返す必要があります。従来のDataSet型は、
IXmlSerializable
属性でマークされていないXmlSchemaProviderAttribute
型です。 代わりに、スキーマ生成に GetSchema メソッドを使用します。 このパターンはDataSet
型に使用され、型指定されたデータセットは以前のバージョンの .NET Framework でクラスを派生させますが、現在は廃止され、従来の理由でのみサポートされています。 このパターンに依存せず、常にXmlSchemaProviderAttribute
をIXmlSerializable
型に適用してください。
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
属性が適用されている場合、グローバル要素宣言は、 ElementName、 Namespace、および IsNullableのプロパティを使用してエクスポートされます。 XmlRootAttribute
が適用される既定値は、データ コントラクト名、空白の名前空間、および "nillable" が true です。
同じグローバル要素宣言規則が、レガシ データセット型に適用されます。 XmlRootAttribute
は、カスタム コードを介して、スキーマプロバイダーメソッドでXmlSchemaSet
に追加されたり、レガシーデータセット型のGetSchema
を通じて追加されたりしたグローバル要素宣言をオーバーライドすることはできないことに注意してください。
IXmlSerializable 要素型
IXmlSerializable
要素型には、 IsAny
プロパティが true
に設定されているか、スキーマ プロバイダー メソッドから null
が返されます。
要素型のシリアル化と逆シリアル化は、コンテンツ タイプのシリアル化と逆シリアル化とよく似ています。 ただし、いくつかの重要な違いがあります。
WriteXml
実装では、1 つの要素 (もちろん複数の子要素を含む可能性があります) を記述することが想定されています。 この 1 つの要素、複数の兄弟要素、または混合コンテンツの外部に属性を書き込むべきではありません。 要素が空の場合があります。ReadXml
実装では、ラッパー要素を読み取らてはなりません。WriteXml
生成される 1 つの要素を読み取ることが期待されます。要素型を定期的にシリアル化する場合 (データ コントラクトのデータ メンバーなど)、シリアライザーは、コンテンツ タイプと同様に、
WriteXml
を呼び出す前にラッパー要素を出力します。 ただし、最上位レベルで要素型をシリアル化する場合、WriteXml
またはDataContractSerializer
コンストラクターでシリアライザーを構築するときにルート名と名前空間が明示的に指定されていない限り、シリアライザーは通常、書き込みNetDataContractSerializer
要素の周囲にラッパー要素を出力しません。 詳細については、「 シリアル化と逆シリアル化」を参照してください。構築時にルート名と名前空間を指定せずに最上位レベルで要素型をシリアル化する場合、 WriteStartObject と WriteEndObject は基本的に何も行わず、 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 の表し
XmlElement
、XmlNode
の配列、およびIXmlSerializable
型を使用すると、データ コントラクト モデルに任意の XML を挿入できます。 DataContractSerializer
とNetDataContractSerializer
は、プロセスを妨げることなく、使用中の XML ライターにこの XML コンテンツを渡します。 ただし、XML ライターは、書き込む XML に特定の制限を適用する場合があります。 具体的には、いくつかの重要な例を次に示します。
XML ライターでは、通常、別のドキュメントの書き込み中に XML ドキュメント宣言 (たとえば、 <?xml version='1.0' ?>) は許可されません。 完全な XML ドキュメントを取得して、データ メンバーの
Array
のXmlNode
としてシリアル化することはできません。 これを行うには、ドキュメント宣言を取り除くか、独自のエンコード スキームを使用してそれを表す必要があります。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
スイッチを使用してそれらをポイントします。