当我们使用XmlSerializer序列化时,创建一些XmlSerializer对象时,内存会不断增加。
引起的原因:当创建这个对象时,会动态的加载一些程序集,但是我们又不可以手动销毁这些程序集,就会导致在创建N多个XmlSerializer时,内存会占用很多。
最简单的解决方案是使用下面提到的两个构造函数中的一个。 否则,必须在 ConcurrentDictionary中缓存程序集,如下面的示例所示。
XmlSerializer.XmlSerializer(Type)
XmlSerializer.XmlSerializer(Type, String)
ConcurrentDictionary方式:
public static ConcurrentDictionary<Type, XmlSerializer> _xmlCached = new ConcurrentDictionary<Type, XmlSerializer>();
至于为什么使用ConcurrentDictionary而不是Dictionary,这就涉及到线程安全了,大家可自行查阅。
这时候我们便可使用XmlSerializer来序列化了。
public string Serialzer(T t)
{
using (StringWriter sw = new StringWriter())
{
XmlSerializer xs = GetXmlSerializer(t.GetType());
xs.Serialize(sw, t);
return sw.ToString();
}
}
private XmlSerializer GetXmlSerializer(Type type)
{
return _xmlCached.GetOrAdd(type, p => new XmlSerializer(type));
}