정식 버전 2.0이 출시되기 전에는 DataTable의 새로운 기능이 직렬화를 지원한다는 홍보를 많이 보았는데, 앞으로는 DataTable을 사용하는 것이 DataSet만큼 편리할 것이라고 생각했습니다. 그러나 실제로는 그렇지 않다는 것을 알게 되었습니다. 프로젝트를 적용했습니다.
DataTable은 직렬화를 지원하지만 Microsoft에서는 이를 특별히 편리하게 만들지 않았습니다. WebService에서 DataTable을 전달하려면 여전히 몇 가지 작업을 수행해야 합니다. 그렇지 않으면 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에 사용되며 wsdl 내에서 DataTable에 대한 스키마를 인식하는 데 사용됩니다.
Hashtable importTypes = new Hashtable();
공개 재정의 문자열 ImportSchemaType(문자열 이름, 문자열 SchemaNamespace, XmlSchemaObject 컨텍스트, XmlSchemas 스키마, XmlSchemaImporter 가져오기 도구, CodeCompileUnit compileUnit, CodeNamespace mainNamespace, CodeGenerationOptions 옵션, CodeDomProvider codeProvider)
{
IList 값 = Schemas.GetSchemas(schemaNamespace)
if (values.Count != 1)
{
return null;
}
XmlSchema 스키마 = 값[0] as XmlSchema;
if (schema == null)
return
null
, Schemas, importer, compileUnit, mainNamespace, options, codeProvider);
공개 재정의 문자열 ImportSchemaType(XmlSchemaType 유형, XmlSchemaObject 컨텍스트, XmlSchemas 스키마, XmlSchemaImporter 가져오기 도구, CodeCompileUnit compileUnit, CodeNamespace mainNamespace, CodeGenerationOptions 옵션, CodeDomProvider codeProvider)
{
if (유형 == null)
{
null 반환
}
if (importedTypes[type] != null)
{
mainNamespace.Imports.Add(new CodeNamespaceImport(typeof(DataSet).Namespace));
compileUnit.ReferencedAssemblies.Add("System.Data.dll")
return (string)importedTypes[type]
}
if (!(context is 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);
mainNamespace.Imports.Add(new CodeNamespaceImport(typeof(DataTable).Namespace));
");
유형 이름 반환;
}
}
}
}
null 반환;
}
}
}
이 클래스를 프로젝트에 추가하고 강력한 이름을 지정한 후 프로젝트를 컴파일합니다.
그런 다음 Assembly 어셈블리를 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.직렬화>
<schemaImporter확장>
<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