Sebelum versi resmi 2.0 dirilis, saya melihat semua publisitas tentang fitur baru DataTable yang mendukung serialisasi. Saya pikir mulai sekarang menggunakan DataTable akan senyaman DataSet menerapkan proyek tersebut.
DataTable mendukung serialisasi, tetapi Microsoft belum membuatnya nyaman. Kita masih perlu melakukan beberapa pekerjaan sendiri sebelum kita dapat meneruskan DataTable di WebService. Jika tidak, saat kita mereferensikan DataTable, kita akan menemukan bahwa DataTable telah menjadi proxy. jenis.
Pertama tulis class DataTableSchemaImporterExtension, kodenya sebagai berikut:
menggunakan Sistem;
menggunakan System.Collections.Generik;
menggunakan Sistem.Teks;
menggunakan System.Xml.Serialization.Advanced;
menggunakan Sistem.Koleksi;
menggunakan System.Xml.Schema;
menggunakan System.Xml.Serialisasi;
menggunakan Sistem.CodeDom;
menggunakan Sistem.CodeDom.Compiler;
menggunakan Sistem.Xml;
menggunakan System.Data;
namespace Xrinehart.Tools.WebService.SchemaImporter
{
kelas DataTableSchemaImporterExtension : SchemaImporterExtension
{
// DataTableSchemaImporterExtension digunakan untuk Layanan Web, digunakan untuk mengenali skema DataTable dalam wsdl
Hashtable importTypes = new Hashtable();
string penggantian publik ImportSchemaType(nama string, string SchemaNamespace, konteks XmlSchemaObject, skema XmlSchemas, importir XmlSchemaImporter, CodeCompileUnit kompilasiUnit, CodeNamespace mainNamespace, opsi CodeGenerationOptions, CodeDomProvider codeProvider)
{
Nilai IList = skema.GetSchemas(schemaNamespace)
;
{
return null;
}
Skema XmlSchema = nilai[0] sebagai XmlSchema;
if (skema == null)
mengembalikan
null
;
string penggantian publik ImportSchemaType (tipe XmlSchemaType, konteks XmlSchemaObject, skema XmlSchemas, importir XmlSchemaImporter, CompileUnit CodeCompileUnit, CodeNamespace mainNamespace, opsi CodeGenerationOptions, CodeDomProvider codeProvider)
{
jika (ketik == null)
{
kembalikan nol;
}
jika (Tipe yang diimpor[tipe] != nol)
{
mainNamespace.Imports.Add(new CodeNamespaceImport(typeof(DataSet).Namespace));
kompilasiUnit.ReferencedAssemblies.Add("System.Data.dll");
return(
string)
importedTypes[type];
XmlSchemaElement))
mengembalikan nol;
jika (tipenya adalah XmlSchemaComplexType)
{
XmlSchemaComplexType ct = (XmlSchemaComplexType) ketik
jika (ct.Particle adalah XmlSchemaSequence)
{
{
XmlSchemaAny any0 = (XmlSchemaAny)item[0];
XmlSchemaAny any1 = (XmlSchemaAny)item[1]
jika (any0.Namespace == diffgram-v1")
{
string typeName = typeof(DataTable).FullName;
importTypes.Add
(type, typeName);
mainNamespace.Imports.Add(new CodeNamespaceImport(typeof(DataTable).Namespace));
");
kembalikan namatipe;
}
}
}
}
kembalikan nol;
}
}
}
Tambahkan kelas ini ke sebuah proyek, dan kompilasi proyek tersebut setelah memberinya nama yang kuat.
Kemudian, tambahkan Majelis Majelis ke GAC.
Terakhir modifikasi local machine.config, kodenya sebagai berikut:
<sectionGroup name="system.xml.serialization" type="System.Xml.Serialization.Configuration.SerializationSectionGroup, System.Xml, Versi=2.0.0.0, Budaya=netral, PublicKeyToken=b77a5c561934e089">
<section name="schemaImporterExtensions" type="System.Xml.Serialization.Configuration.SchemaImporterExtensionsSection, System.Xml, Versi=2.0.0.0, Budaya=netral, PublicKeyToken=b77a5c561934e089" />
<section name="dateTimeSerialization" type="System.Xml.Serialization.Configuration.DateTimeSerializationSection, System.Xml, Versi=2.0.0.0, Budaya=netral, PublicKeyToken=b77a5c561934e089" />
<section name="xmlSerializer" type="System.Xml.Serialization.Configuration.XmlSerializerSection, System.Xml, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</bagianGrup>
<sistem.xml.serialisasi>
<skemaImporterEkstensi>
<tambahkan nama="dataTableSchemaImporterExtension" type="Xrinehart.Tools.WebService.SchemaImporter.DataTableSchemaImporterExtension, Xrinehart.Tools.WebService.SchemaImporter,Version=1.0.0.0,Culture=netral,PublicKeyToken=5a627ce15fb94702" />
</schemaImporterExtensions>
</system.xml.serialization>
Setelah menyelesaikan langkah-langkah di atas, kompilasi WebService dan referensi ulang (atau perbarui referensi Web), Anda dapat mengidentifikasi tipe DataTable dengan benar.
Faktanya, DataTable hanya mengimplementasikan serialisasi, tetapi WebService tidak dapat melakukan deserialisasi sendiri ke dalam format yang dapat dikenali, sehingga perlu ditambahkan secara manual. Dari sini, berbagai entitas bisnis dapat diturunkan. Objek kelas BusinessEntity juga dapat ditransfer secara langsung melalui metode di atas.
Semoga ini bisa membantu semua orang.
http://www.cnblogs.com/Xrinehart/archive/2006/08/20/481956.html