До выхода официальной версии 2.0 я видел всю рекламу о новых функциях DataTable, поддерживающих сериализацию. Я думал, что с этого момента использовать DataTable будет так же удобно, как и DataSet. Однако, когда я обнаружил, что это не так. применил проект.
DataTable поддерживает сериализацию, но Microsoft не сделала ее особенно удобной. Нам все еще нужно проделать некоторую работу, прежде чем мы сможем передать DataTable в WebService. В противном случае, когда мы ссылаемся на 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
Xrinehart.Tools.WebService.SchemaImporter;
{
класс DataTableSchemaImporterExtension: SchemaImporterExtension
{
// DataTableSchemaImporterExtension используется для WebServices, он используется для распознавания схемы DataTable в wsdl
Hashtable importTypes = new Hashtable();
общедоступная строка переопределения ImportSchemaType (имя строки, пространство схемы_строки, контекст XmlSchemaObject, схемы XmlSchemas, импортер XmlSchemaImporter, CodeCompileUnit compileUnit, CodeNamespace mainNamespace, параметры CodeGenerationOptions, CodeDomProvider codeProvider)
{
Значения IList = Schemas.GetSchemas(schemaNamespace
if (values.Count != 1)
{
return null;
}
Схема XmlSchema = значения [0] как XmlSchema;
if (schema == null)
return
null
, схемы, импортер, compileUnit, mainNamespace, options, codeProvider}
общедоступная строка переопределения ImportSchemaType (тип XmlSchemaType, контекст XmlSchemaObject, схемы XmlSchemas, импортер XmlSchemaImporter, CodeCompileUnit compileUnit, CodeNamespace mainNamespace, параметры CodeGenerationOptions, CodeDomProvider codeProvider)
{
если (тип == ноль)
{
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))
вернуть ноль;
если (тип — XmlSchemaComplexType)
{
XmlSchemaComplexType ct = (XmlSchemaComplexType)type,
если (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);
mainNamespace.Imports.Add(new CodeNamespaceImport(typeof(DataTable).Namespace));
compileUnit.ReferencedAssemblies.Add("System.Data.dll) ");
return typeName;
}
}
}
}
return 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" />
</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>
После выполнения описанных выше шагов, компиляции WebService и повторной ссылки (или обновления веб-ссылки) вы сможете правильно определить тип DataTable.
Фактически DataTable реализует только сериализацию, но WebService не может сам по себе десериализовать ее в распознаваемый формат, поэтому ее необходимо добавлять вручную. Из этого можно получить различные бизнес-сущности. Объекты класса BusinessEntity также можно напрямую передавать с помощью вышеуказанных методов.
Надеюсь, это поможет всем.
http://www.cnblogs.com/Xrinehart/archive/2006/08/20/481956.html