|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
前几天同学问我学习方向的问题。有点想法,不知道对不对,怕误导同学,现在“开源一下”。注:括号内是我现在整理的时填加上的。asp.net|web|参考 在2.0正式版公布之前,就满天的看到关于DataTable撑持序列化的新特征宣扬,满觉得今后今后利用DataTable就和DataSet一样便利了,了局在使用项目标时分才发明并不是那末回事。
DataTable是撑持序列化了,可是微软并没有把他做的出格便利,还必要我们本人来做一些事情以后才干够在WebService内里传送DataTable,不然在援用DataTable的时分会发明DataTable酿成了一个甚么Proxy范例。
起首编写类DataTableSchemaImporterExtension,代码以下:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
usingSystem.Xml.Serialization.Advanced;
usingSystem.Collections;
usingSystem.Xml.Schema;
usingSystem.Xml.Serialization;
usingSystem.CodeDom;
usingSystem.CodeDom.Compiler;
usingSystem.Xml;
usingSystem.Data;
namespaceXrinehart.Tools.WebService.SchemaImporter
{
classDataTableSchemaImporterExtension:SchemaImporterExtension
{
//DataTableSchemaImporterExtensionisusedforWebServices,itisusedtorecognizetheschemaforDataTablewithinwsdl
HashtableimportedTypes=newHashtable();
publicoverridestringImportSchemaType(stringname,stringschemaNamespace,XmlSchemaObjectcontext,XmlSchemasschemas,XmlSchemaImporterimporter,CodeCompileUnitcompileUnit,CodeNamespacemainNamespace,CodeGenerationOptionsoptions,CodeDomProvidercodeProvider)
{
IListvalues=schemas.GetSchemas(schemaNamespace);
if(values.Count!=1)
{
returnnull;
}
XmlSchemaschema=values[0]asXmlSchema;
if(schema==null)
returnnull;
XmlSchemaTypetype=(XmlSchemaType)schema.SchemaTypes[newXmlQualifiedName(name,schemaNamespace)];
returnImportSchemaType(type,context,schemas,importer,compileUnit,mainNamespace,options,codeProvider);
}
publicoverridestringImportSchemaType(XmlSchemaTypetype,XmlSchemaObjectcontext,XmlSchemasschemas,XmlSchemaImporterimporter,CodeCompileUnitcompileUnit,CodeNamespacemainNamespace,CodeGenerationOptionsoptions,CodeDomProvidercodeProvider)
{
if(type==null)
{
returnnull;
}
if(importedTypes[type]!=null)
{
mainNamespace.Imports.Add(newCodeNamespaceImport(typeof(DataSet).Namespace));
compileUnit.ReferencedAssemblies.Add("System.Data.dll");
return(string)importedTypes[type];
}
if(!(contextisXmlSchemaElement))
returnnull;
if(typeisXmlSchemaComplexType)
{
XmlSchemaComplexTypect=(XmlSchemaComplexType)type;
if(ct.ParticleisXmlSchemaSequence)
{
XmlSchemaObjectCollectionitems=((XmlSchemaSequence)ct.Particle).Items;
if(items.Count==2&&items[0]isXmlSchemaAny&&items[1]isXmlSchemaAny)
{
XmlSchemaAnyany0=(XmlSchemaAny)items[0];
XmlSchemaAnyany1=(XmlSchemaAny)items[1];
if(any0.Namespace==XmlSchema.Namespace&&any1.Namespace=="urn:schemas-microsoft-com:xml-diffgram-v1")
{
stringtypeName=typeof(DataTable).FullName;
importedTypes.Add(type,typeName);
mainNamespace.Imports.Add(newCodeNamespaceImport(typeof(DataTable).Namespace));
compileUnit.ReferencedAssemblies.Add("System.Data.dll");
returntypeName;
}
}
}
}
returnnull;
}
}
}
为此类增加进一个项目中,并将此项目举行强定名后编译。
然后,把该Assembly程序集到场到GAC中。
最初修正本机的machine.config,代码以下:
<sectionGroupname="system.xml.serialization"type="System.Xml.Serialization.Configuration.SerializationSectionGroup,System.Xml,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089">
<sectionname="schemaImporterExtensions"type="System.Xml.Serialization.Configuration.SchemaImporterExtensionsSection,System.Xml,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089"/>
<sectionname="dateTimeSerialization"type="System.Xml.Serialization.Configuration.DateTimeSerializationSection,System.Xml,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089"/>
<sectionname="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>
<addname="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,从头援用(大概更新Web援用),就能够准确的辨认DataTable范例了。
实在DataTable只完成了序列化,但WebService其实不能本人反序列化为可辨认的格局,以是必要本人手动增添。由此能够衍生为各类营业实体BussinessEntity类工具也能够经由过程以上体例完成间接传送。
但愿对人人有所匡助。
我认为,可以通过更加简单的首次编译,而增加第二次编译的负担,来提高java的运行效率。只是将java源代码进行简单的等价转换,而不假设编译成某种虚拟机器的目标格式,而由本地编译器针对性的二次编译。 |
|