2016-09-29 56 views
0

这是一个后续问题这一个: XmlSerializer extraTypes memory leak上序列化呼叫的XmlSerializer extraTypes内存泄漏

我已经使用具有使用该extratypes单个静态呼叫的技术过载像这样:

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

其中MyDeviceTypes看起来是这样的:

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

我现在看到的问题是,我每次我CA时间去记忆跳LL序列化:

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 

,我看到同样每增加序列化被称为记忆永远不会被释放的时间,最终导致了内存不足的错误。

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

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

更新: 用简单的测试数据类型替换我的复杂数据类型可以防止发生奇怪的行为(即无内存泄漏并且不会再生Microsoft.GeneratedCode)。什么在我的复杂数据类型可能导致调用序列化决定它需要重新生成每次被称为?

+0

你正确地放置'xwriter'吗?它的类型是什么? – kiziu

+0

你见过[这个答案](http://stackoverflow.com/a/23897411/1997232)? – Sinatr

+0

@Sinatr,OP提到'xmlSerializer'被缓存在'static readonly'字段中。 – kiziu

回答