Bevor die offizielle Version 2.0 veröffentlicht wurde, habe ich die ganze Werbung über die neuen Funktionen von DataTable gesehen, die die Serialisierung unterstützen. Ich habe jedoch herausgefunden, dass dies nicht der Fall ist hat das Projekt angewendet.
DataTable unterstützt die Serialisierung, aber Microsoft hat es nicht besonders praktisch gemacht, bevor wir die DataTable im WebService übergeben können. Andernfalls werden wir feststellen, dass die DataTable zu einem Proxy geworden ist. Typ.
Schreiben Sie zuerst die Klasse DataTableSchemaImporterExtension. Der Code lautet wie folgt:
Verwenden des Systems;
mit System.Collections.Generic;
Verwenden von System.Text;
mit System.Xml.Serialization.Advanced;
Verwenden von System.Collections;
mit System.Xml.Schema;
mit System.Xml.Serialization;
mit System.CodeDom;
mit System.CodeDom.Compiler;
mit System.Xml;
unter Verwendung von System.Data;
Namespace Xrinehart.Tools.WebService.SchemaImporter
{
Klasse DataTableSchemaImporterExtension: SchemaImporterExtension
{
// DataTableSchemaImporterExtension wird für WebServices verwendet, es wird verwendet, um das Schema für DataTable innerhalb von wsdl zu erkennen
Hashtable importTypes = new Hashtable();
öffentliche Überschreibungszeichenfolge ImportSchemaType(Zeichenfolgenname, Zeichenfolge schemaNamespace, XmlSchemaObject-Kontext, XmlSchemas-Schemas, XmlSchemaImporter-Importer, CodeCompileUnit compileUnit, CodeNamespace mainNamespace, CodeGenerationOptions-Optionen, CodeDomProvider codeProvider)
{
IList-Werte = schemas.GetSchemas(schemaNamespace);
if (values.Count != 1)
{
return
null
;
}
öffentliche Überschreibungszeichenfolge ImportSchemaType(XmlSchemaType-Typ, XmlSchemaObject-Kontext, XmlSchemas-Schemas, XmlSchemaImporter-Importer, CodeCompileUnit CompileUnit, CodeNamespace MainNamespace, CodeGenerationOptions-Optionen, CodeDomProvider CodeProvider)
{
if (type == null)
{
return null;
}
if (importedTypes[type] != null)
{
mainNamespace.Imports.Add(new CodeNamespaceImport(typeof(DataSet).Namespace));
yield
(
string)importedTypes[type]
; XmlSchemaElement))
return null;
if (Typ ist XmlSchemaComplexType)
{
XmlSchemaComplexType ct = (XmlSchemaComplexType)type;
if (ct.Particle ist XmlSchemaSequence)
{
{
XmlSchemaAny any0 = (XmlSchemaAny)items[0];
XmlSchemaAny any1 =(
XmlSchemaAny)items[1];
{
string typeName = typeof(DataTable).FullName;
importTypes.Add(type, typeName);
mainNamespace.Imports.Add(new CodeNamespaceImport(typeof(DataTable).Namespace));
crimeUnit.ReferencedAssemblies.Add("System.Data.dll ");
return typeName;
}
}
}
}
return null;
}
}
}
Fügen Sie diese Klasse einem Projekt hinzu und kompilieren Sie das Projekt, nachdem Sie ihm einen starken Namen gegeben haben.
Fügen Sie dann die Assembly-Assembly zum GAC hinzu.
Ändern Sie abschließend die lokale machine.config. Der Code lautet wie folgt:
<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" />
</sectionGroup>
<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>
Nachdem Sie die obigen Schritte ausgeführt, den WebService kompiliert und erneut referenziert (oder die Webreferenz aktualisiert) haben, können Sie den DataTable-Typ korrekt identifizieren.
Tatsächlich implementiert DataTable nur die Serialisierung, WebService kann sie jedoch nicht selbst in ein erkennbares Format deserialisieren, sodass sie manuell hinzugefügt werden muss. Daraus können auch verschiedene Business-Entity-Klassenobjekte direkt über die oben genannten Methoden übertragen werden.
Ich hoffe, es hilft allen.
http://www.cnblogs.com/Xrinehart/archive/2006/08/20/481956.html