【发布时间】:2018-02-02 21:35:29
【问题描述】:
我有两个项目的解决方案;一个 asp.net MVC 应用程序和一个类库。我们称它们为 MVC 项目和 CLS 项目。
在 CLS 项目中,有两个不同版本的 XSD 文件(V1 和 V2),我使用 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 文件仍然需要很长时间。所以,还是应该有问题。但是,我不知道是什么。请帮忙。
更新:
我按照 cmets 中的建议使用了 Fuslogvw.exe,我可以看到 CLS.XmlSerializers.dll 正在成功加载。那么,为什么第一次反序列化 XML 文件大约需要 1 分钟,但之后每次都不到 1 秒?
更新 2:
两个 XSD 文件之间的区别之一是第二个 (V2) 引用了一个非常大的 XSD 文件,该文件包含一些在主文件中使用的 xs:enumeration 类型的定义。而且,这就是反序列化需要很长时间的原因。由于我需要做的就是将 XML 文件反序列化为对象,并且不需要针对这些枚举验证属性和元素的值,因此我最终删除了对该 XSD 文件的引用,并将所有枚举类型替换为它们的基本类型(在本例中为xs:string)。现在,V2 的反序列化速度和 V1 一样快,我什至不需要使用 Sgen.exe。我猜Sgen.exe 仅在需要反序列化非常大的 XML 文件的情况下才有帮助。在我的例子中,XML 文件总是非常小,但是反序列化是(曾经)复杂的。
【问题讨论】:
-
“它很慢”并不能完全保证。但可以肯定的是,DLL 位于错误的目录中的可能性总是很大。不要猜测,运行 Fuslogvw.exe 并记录所有绑定。
-
@HansPassant,查看我更新的帖子。
-
你的根对象有没有可能是某种通用集合或容器?正如here 所提到的,这些并不总是与
sgen程序集配合得很好。 -
@dbc,不,不是。
-
我也会使用 procmon 和监视文件。它会找到序列化程序程序集,但可能需要一些时间才能找到它。
标签: c# serialization xml-serialization xmlserializer sgen