Avant la sortie de la version officielle 2.0, j'ai vu toute la publicité sur les nouvelles fonctionnalités de DataTable prenant en charge la sérialisation. Je pensais qu'utiliser DataTable serait désormais aussi pratique que DataSet. Cependant, j'ai découvert que ce n'était pas le cas lorsque je l'ai fait. appliqué le projet.
DataTable prend en charge la sérialisation, mais Microsoft ne l'a pas rendu particulièrement pratique. Nous devons encore travailler nous-mêmes avant de pouvoir transmettre le DataTable dans le WebService. Sinon, lorsque nous référencerons le DataTable, nous constaterons que le DataTable est devenu un proxy. taper.
Écrivez d’abord la classe DataTableSchemaImporterExtension, le code est le suivant :
utiliser le système ;
en utilisant System.Collections.Generic ;
en utilisant System.Text ;
en utilisant System.Xml.Serialization.Advanced ;
en utilisant System.Collections ;
en utilisant System.Xml.Schema ;
en utilisant System.Xml.Serialization ;
en utilisant System.CodeDom ;
en utilisant System.CodeDom.Compiler ;
en utilisant System.Xml ;
en utilisant System.Data ;
espace de noms Xrinehart.Tools.WebService.SchemaImporter
{
classe DataTableSchemaImporterExtension : SchemaImporterExtension
{
// DataTableSchemaImporterExtension est utilisé pour les WebServices, il est utilisé pour reconnaître le schéma de DataTable dans wsdl
Hashtable importerTypes = new Hashtable();
chaîne de remplacement publique ImportSchemaType (nom de chaîne, chaîne schemaNamespace, contexte XmlSchemaObject, schémas XmlSchemas, importateur XmlSchemaImporter, CodeCompileUnit compileUnit, CodeNamespace mainNamespace, options CodeGenerationOptions, CodeDomProvider codeProvider)
{
Valeurs IList = schemas.GetSchemas(schemaNamespace);
if (values.Count != 1)
{
return null;
}
Schéma XmlSchema = valeurs [0] comme XmlSchema ;
if (schema == null)
return
null
;
schémas, importateur, compileUnit, mainNamespace, options, codeProvider}
chaîne de remplacement publique ImportSchemaType (type XmlSchemaType, contexte XmlSchemaObject, schémas XmlSchemas, importateur XmlSchemaImporter, codeCompileUnit compileUnit, CodeNamespace mainNamespace, options CodeGenerationOptions, CodeDomProvider codeProvider)
{
si (type == nul)
{
return null
}
if (importedTypes[type] != null)
{
mainNamespace.Imports.Add(new CodeNamespaceImport(typeof(DataSet).Namespace));
compileUnit.ReferencedAssemblies.Add("System.Data.dll");
return(
string)
importedTypes[type];
XmlSchemaElement))
renvoie null ;
si (le type est XmlSchemaComplexType)
{
XmlSchemaComplexType ct = (XmlSchemaComplexType)type ;
if (ct.Particle est XmlSchemaSequence)
{
{
XmlSchemaAny any0 = (XmlSchemaAny)items[0];
XmlSchemaAny any1 = (XmlSchemaAny
)items[1] ;
{
string typeName = typeof(DataTable).FullName;
importéTypes.Add
(type, typeName);
mainNamespace.Imports.Add(new CodeNamespaceImport(typeof(DataTable).Namespace));
");
return typeName;
}
}
}
}
return null;
}
}
}
Ajoutez cette classe à un projet et compilez le projet après l'avoir nommé fortement.
Ensuite, ajoutez l’assembly Assembly au GAC.
Modifiez enfin le machine.config local, le code est le suivant :
<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.sérialisation>
<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>
Après avoir terminé les étapes ci-dessus, compilez le WebService et référencez à nouveau (ou mettez à jour la référence Web), vous pouvez identifier correctement le type DataTable.
En fait, DataTable implémente uniquement la sérialisation, mais WebService ne peut pas le désérialiser lui-même dans un format reconnaissable, il doit donc être ajouté manuellement. À partir de là, diverses entités commerciales peuvent être dérivées. Les objets de la classe BusinessEntity peuvent également être directement transférés via les méthodes ci-dessus.
J'espère que cela aide tout le monde.
http://www.cnblogs.com/Xrinehart/archive/2006/08/20/481956.html