我有两个项目的解决方案;一个 asp.net MVC 应用程序和一个类库。我们称它们为项目 MVC 和项目 CLS。
在 CLS 项目中,有两个不同版本的 XSD 文件(V1 和 V2),我使用xsd2code创建了两个同名但在不同命名空间(V1 和 V2)下的可序列化类。
在 MVC 项目中,当用户上传一个 XML 文件时,CLS.dll
用于将 XML 反序列化为一个对象。当XML文件是V1类型时,反序列化非常快,但是V2版本的XSD文件要复杂很多,反序列化可能需要几分钟,只有第一次(之后非常快) ,直到应用程序再次运行)。
我使用Sgen.exe工具CLS.XmlSerializers.dll
为 CLS.V2 类型创建了一个序列化程序程序集 ( ),以消除第一次即时创建程序集,从而提高性能。
我已经成功地将 Sgen 任务添加到 Post Build 事件中,并且CLS.XmlSerializers.dll
每次构建项目时都会创建程序集。此外,我在这篇文章中使用了单元测试代码来确保程序集已加载,并且确实如此。测试成功通过。
但是,第一次反序列化 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 文件总是非常小,但是反序列化是(曾经)复杂的。