XmlSerializer extraTypes序列化调用中的内存泄漏

时间:2016-09-29 12:58:07

标签: c# .net memory-leaks xmlserializer

这是对此问题的后续问题: XmlSerializer extraTypes memory leak

我使用了使用extratypes重载的单个静态调用的技术,如下所示:

static readonly XmlSerializer xmlSerializer = new XmlSerializer(typeof(MyDeviceType[]), MyDeviceTypes);

其中MyDeviceTypes如下所示:

static readonly Type[] MyDeviceTypes = { typeof(DeviceType1), typeof(DeviceType2) };

我现在看到的问题是每次调用Serialize时都会出现内存跳转:

Logger.LogError("SaveDevices: Before Serialize call - " + GetMemoryUsage());
xmlSerializer.Serialize(xwriter, devices); 
Logger.LogError("SaveDevices: After Serialize call - " + GetMemoryUsage());

所以我的日志看起来像这样:

9/28/2016 5:14:32 PM SaveDevices: Before Serialize call - 344,182,784
9/28/2016 5:14:36 PM SaveDevices: After Serialize call - 359,600,128
每次调用Serialize时都会看到相同的增加,内存永远不会被释放,最终导致Out of Memory错误。

我尝试在app.config中设置XmlSerialization.Compilation开关,但我没有看到任何源代码,但我确实看到了Microsoft.GeneratedCode.dll和Microsoft.GeneratedCode.pdb文件。当我观察我的应用程序运行时,每次调用Serialize时都会重新生成此文件。

如何修改此行为,以便它不会在每次Serialize调用上消耗内存并每次重新生成代码?

更新: 用简单的测试数据类型替换我的复杂数据类型可以防止发生奇怪的行为(即没有内存泄漏,也没有Microsoft.GeneratedCode的重新生成)。我的复杂数据类型中的哪些内容可能导致对Serialize的调用决定每次调用它时都需要重新生成?

1 个答案:

答案 0 :(得分:0)

我们能够通过在另一个应用程序域中执行需要XmlSeralizer的工作来解决此问题,然后按照此处的答案评论中的建议将必要的结果传递回调用域:XmlSerializer extraTypes memory leak。来自这里的AppDomainToolkit:https://github.com/jduv/AppDomainToolkit让生活更加简单。