正式バージョン 2.0 がリリースされる前に、シリアル化をサポートする DataTable の新機能についての宣伝を目にして、今後は DataTable を使用すると DataSet と同じくらい便利になるだろうと思っていましたが、実際に使ってみるとそうではないことがわかりました。プロジェクトを適用しました。
DataTable はシリアル化をサポートしていますが、Microsoft はそれを特に便利にするようにはしていません。そうしないと、DataTable を参照するときに DataTable がプロキシになっていることがわかります。タイプ。
まず DataTableSchemaImporterExtension クラスを作成します。コードは次のとおりです。
システムを使用する;
System.Collections.Generic を使用します。
System.Text を使用します。
System.Xml.Serialization.Advanced を使用します。
System.Collections を使用します。
System.Xml.Schema を使用します。
System.Xml.Serialization を使用します。
System.CodeDom を使用します。
System.CodeDom.Compiler を使用します。
System.Xml を使用します。
System.Data
名前空間
を使用します。
{
クラス DataTableSchemaImporterExtension : SchemaImporterExtension
{
// DataTableSchemaImporterExtension は WebServices に使用され、wsdl Hashtable 内の DataTable のスキーマを認識するために使用されます
。
パブリック オーバーライド string ImportSchemaType(文字列名、文字列 schemaNamespace、XmlSchemaObject コンテキスト、XmlSchemas スキーマ、XmlSchemaImporter インポータ、CodeCompileUnit コンパイルユニット、CodeNamespace mainNamespace、CodeGenerationOptions オプション、CodeDomProvider codeProvider)
{
IList 値 = schemas.GetSchemas(schemaNamespace)
if (values.Count != 1);
{
return null;
}
XmlSchema schema = value[0] as XmlSchema;
if (schema == null)
return
null
;
}
パブリック オーバーライド文字列 ImportSchemaType(XmlSchemaType タイプ、XmlSchemaObject コンテキスト、XmlSchemas スキーマ、XmlSchemaImporter インポータ、CodeCompileUnit コンパイルユニット、CodeNamespace mainNamespace、CodeGenerationOptions オプション、CodeDomProvider codeProvider)
{
if (type == null)
{
null を返す
}
if (importedTypes[type] != null)
{
mainNamespace.Imports.Add(new CodeNamespaceImport(typeof(DataSet).Namespace));
applyUnit.ReferencedAssemblies.Add
("System.Data.dll");
return (string)importedTypes[type]
; XmlSchemaElement))
null を返します。
if (型は XmlSchemaComplexType です)
{
XmlSchemaComplexType ct = (XmlSchemaComplexType)type
if (ct.Particle が XmlSchemaSequence)
{
{
XmlSchemaAny any0 = (XmlSchemaAny)items[0];
XmlSchemaAny any1 = (XmlSchemaAny)items[1];
if (any0.Namespace == diffgram-v1")
{
string typeName = typeof(DataTable).FullName;
importTypes.Add
(type, typeName);
mainNamespaceImport(typeof(DataTable).Namespace));
");
typeName を返します;
}
}
}
}
null を返します;
}
}
}
このクラスをプロジェクトに追加し、強力な名前を付けてプロジェクトをコンパイルします。
次に、アセンブリ アセンブリを GAC に追加します。
最後にローカルの machine.config を変更します。コードは次のとおりです。
<sectionGroup name="system.xml.serialization" type="System.Xml.Serialization.Configuration.SerializationSectionGroup, System.Xml, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<section name="schemaImporterExtensions" type="System.Xml.Serialization.Configuration.SchemaImporterExtensionsSection, System.Xml, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<section name="dateTimeSerialization" type="System.Xml.Serialization.Configuration.DateTimeSerializationSection, System.Xml, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<section name="xmlSerializer" type="System.Xml.Serialization.Configuration.XmlSerializerSection, System.Xml, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</セクショングループ>
<system.xml.serialization>
<schemaImporterExtensions>
<add name="dataTableSchemaImporterExtension" type="Xrinehart.Tools.WebService.SchemaImporter.DataTableSchemaImporterExtension, Xrinehart.Tools.WebService.SchemaImporter,Version=1.0.0.0,Culture=neutral,PublicKeyToken=5a627ce15fb94702" />
</schemaImporterExtensions>
</system.xml.serialization>
上記の手順を完了した後、WebService をコンパイルして再参照 (または Web 参照を更新) すると、DataTable タイプを正しく識別できます。
実際、DataTable はシリアル化を実装するだけですが、WebService はそれを単独で認識可能な形式に逆シリアル化できないため、手動で追加する必要があります。これから、さまざまなビジネス エンティティを派生し、上記のメソッドを通じて BusinessEntity クラス オブジェクトを直接転送することもできます。
皆さんのお役に立てれば幸いです。
http://www.cnblogs.com/Xrinehart/archive/2006/08/20/481956.html