我有一个解决方案,包含两个项目:一个asp.net MVC应用程序和一个类库。我们称之为MVC项目和CLS项目。
在CLS项目中,我使用了两个不同版本(V1和V2)的XSD文件,并使用xsd2code创建了两个具有相同名称但位于不同命名空间(V1和V2)下的可序列化类。
在MVC项目中,当用户上传一个XML文件时,使用
我使用Sgen.exe工具为CLS.V2类型创建了一个序列化程序集(
在CLS项目中,我使用了两个不同版本(V1和V2)的XSD文件,并使用xsd2code创建了两个具有相同名称但位于不同命名空间(V1和V2)下的可序列化类。
在MVC项目中,当用户上传一个XML文件时,使用
CLS.dll
将XML反序列化为对象。当XML文件属于V1类型时,反序列化非常快,但是V2版本的XSD文件更加复杂,反序列化可能需要几分钟时间,仅第一次运行应用程序时会出现这种情况。我使用Sgen.exe工具为CLS.V2类型创建了一个序列化程序集(
CLS.XmlSerializers.dll
),以消除动态创建程序集的首次创建,从而提高性能。
我已成功将Sgen任务添加到Post Build事件中,并且每次构建项目时都会创建程序集CLS.XmlSerializers.dll
。此外,我使用this post中的单元测试代码来确保程序集已加载,并且它确实通过了测试。
然而,第一次反序列化XML文件仍然需要很长时间。因此,仍然有些问题。但是,我不知道是什么问题。请帮忙。
更新:
我按照评论中的建议使用了Fuslogvw.exe
,并且可以看到CLS.XmlSerializers.dll
已成功加载。那么,为什么第一次反序列化XML文件需要大约一分钟,而之后每次都只需要不到一秒钟呢?
更新2:
两个XSD文件之间的一个区别是第二个(V2)引用了一个非常大的XSD文件,其中包含一些在主文件中使用的xs:enumeration
类型的定义。这就是反序列化需要很长时间的原因。由于我所需要做的只是将XML文件反序列化为对象,并不需要根据这些枚举值验证属性和元素的值,因此我最终删除了对该XSD文件的引用,并用它们的基本类型(在这种情况下为xs:string
)替换了所有枚举类型。现在,V2的反序列化与V1一样快,甚至不需要使用Sgen.exe
。我想Sgen.exe
仅在需要反序列化非常大的XML文件时才有帮助。在我的情况下,XML文件始终非常小,但反序列化却很复杂。
sgen
程序集兼容。 - dbc