1. 程式人生 > 其它 >XmlSerializer類導致記憶體洩漏和效能低

XmlSerializer類導致記憶體洩漏和效能低

微信雲上管車,接入微信開放平臺的通訊錄,審批流等介面,微信回撥我們的介面,資料型別為xml格式,我們介面需要處理資料時用到XmlSerializer

為了提高效能,XML 序列化基礎結構動態生成程式集,以便對指定型別進行序列化和反序列化。 該基礎結構將找到並重新使用這些程式集。 僅當使用以下建構函式時,才會發生此行為:
XmlSerializer.XmlSerializer(Type)
XmlSerializer.XmlSerializer(Type, String)

如果使用任何其他建構函式,則將生成同一個程式集的多個版本,這些版本始終不予解除安裝,從而導致記憶體洩漏和效能低下,具體表現:工作管理員中看到程式記憶體佔用一直在長。 最簡單的解決方案是使用前面提到的兩個建構函式中的一個。 否則,必須在 Dictionary 中快取程式集,如下面的示例所示。

public static ConcurrentDictionary<Type, XmlSerializer> serializerMap = new ConcurrentDictionary<Type, XmlSerializer>();public static T GetInfoFromXML(string data)
{
T objectInfo = default(T);

	LogWriter.ToTrace("反序列化XML:" + data);
	if (string.IsNullOrEmpty(data))
	{
		return objectInfo;
	}
	var dicKey = typeof(T);
	serializerMap.TryGetValue(dicKey, out var serializer);
	if (serializer==null)
	{
		serializer= new XmlSerializer(dicKey, new XmlRootAttribute("xml"));
		serializerMap.TryAdd(dicKey, serializer);
	}
	
	using (TextReader txtReader = new StringReader(data))
	{
		objectInfo = (T)serializer.Deserialize(txtReader);
	}
	return objectInfo;
}

}