XmlSerializer - 第一个反序列化非常慢

ata*_*ati 7 c# serialization sgen xml-serialization xmlserializer

我有两个项目的解决方案; 一个asp.net MVC应用程序和一个类库.我们称他们为项目MVC和项目CLS.

在项目CLS中,有两个不同版本(V1和V2)的XSD文件,我用它来创建两个具有相同名称的可序列化类,但使用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文件总是很小,但是反序列化很复杂.

Ale*_*kin 1

这是 x64 jit 编译器的一个已知问题,在某些情况下可能会非常慢。这就是为什么在代码已经编译后第二次运行反序列化时会有更好的性能。

尝试使用.net 4.6或更高版本,它具有新版本的x64 jit编译器(RyuJIT)。如果无法更新 .net 版本,请查看此线程