c# - XmlSerializer - 第一次反序列化非常慢

标签 c# serialization xml-serialization xmlserializer sgen

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

在项目 CLS 中,有一个 XSD 文件的两个不同版本(V1 和 V2),我使用这些文件创建了两个具有相同名称但在不同命名空间(V1 和 V2)下的可序列化类,使用 xsd2code .

在 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 文件总是很小,但反序列化很复杂。

最佳答案

为了提高 XML 序列化的性能,每次针对特定类型首次实例化 XmlSerializer 时都会动态生成程序集。它在应用程序生命周期中只发生一次,但这使得它的第一次使用很慢。

When you instantiate an XmlSerializer you have to pass the Type of the objects that you will attempt to serialize and deserialize with that serializer instance. The serializer examines all public fields and properties of the Type to learn about which types an instance references at runtime. It then proceeds to create C# code for a set of classes to handle serialization and deserialization using the classes in the System.CodeDOM namespace. During this process, the XmlSerializer checks the reflected type for XML serialization attributes to customize the created classes to the XML format definition. These classes are then compiled into a temporary assembly and called by the Serialize() and Deserialize() methods to perform the XML to object conversions.

完整内容:Troubleshooting Common Problems with the XmlSerializer

更多信息:XmlSerializer Constructor Performance Issues

关于c# - XmlSerializer - 第一次反序列化非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45871161/

相关文章:

c# - 默认策略。策略模式 C#

c# - 如何将两个 float 组的 JSON 解析为两个列表?

c# - 具有不同 CurrentCulture 和 CurrentUICulture 的 WPF 应用程序

java - 保存设置的实现

C++ MFC 序列化

jquery - 使用 jQuery 从 CKEditor 的 iframe 中获取内容

c# - 一种通用列表反序列化类?

c# - ASP.NET:同步客户端和服务器端验证规则

c# - XmlSerializer : "The type ' Type' may not be used in this context"

java - 简单的 XML 反序列化