[英]Where is memory leak (Serialize object)
我有这种方法:
public static string XmlSerialize<T>(T data)
{
string result;
using (StringWriter stringWriter = new StringWriter())
{
XmlWriterSettings settings = new XmlWriterSettings
{
Encoding = Encoding.UTF8,
OmitXmlDeclaration = true,
};
using (XmlWriter writer = XmlWriter.Create(stringWriter, settings))
{
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("", "");
XmlSerializer serializer = XmlSerializer.FromTypes(new[] { typeof(T) })[0];
serializer.Serialize(writer, data, ns);
}
result = stringWriter.ToString();
}
return result;
}
这是将对象序列化为xml的简单方法。 但是这种方法有内存泄漏,我也不知道它在哪里。
谁能帮我找到它?
问题出在XMLSerializer中,这是设计上的官方行为。
动态生成的装配体
为了提高性能,XML序列化基础结构动态生成程序集以序列化和反序列化指定的类型。 基础结构查找并重用这些程序集。 仅当使用以下构造函数时,才会发生此现象:
XmlSerializer.XmlSerializer(Type)
XmlSerializer.XmlSerializer(Type, String)
如果使用任何其他构造函数,则将生成同一程序集的多个版本,并且永远不会将其卸载,这会导致内存泄漏和性能下降。 最简单的解决方案是使用前面提到的两个构造函数之一。 否则,您必须将程序集缓存在哈希表中,如以下示例所示
并在此处阅读有关XmlSerializer.FromTypes的更多信息 :
您应该使用Dispose()方法从内存中释放资源,因为C#垃圾收集器不会对具有Dispose()方法的任何对象执行此操作。
public static string XmlSerialize<T>(T data)
{
string result;
using (StringWriter stringWriter = new StringWriter())
{
XmlWriterSettings settings = new XmlWriterSettings
{
Encoding = Encoding.UTF8,
OmitXmlDeclaration = true,
};
using (XmlWriter writer = XmlWriter.Create(stringWriter, settings))
{
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("", "");
XmlSerializer serializer = XmlSerializer.FromTypes(new[] { typeof(T) })[0];
serializer.Serialize(writer, data, ns);
if (writer != null)
writer.Dispose();
}
result = stringWriter.ToString();
if (stringWriter != null)
stringWriter.Dispose();
}
return result;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.