XmlSerializer類導致記憶體洩漏和效能低
阿新 • • 發佈:2021-06-28
微信雲上管車,接入微信開放平臺的通訊錄,審批流等介面,微信回撥我們的介面,資料型別為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
{
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; }
}