我有这个方法:
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的简单方法。但是这种方法有内存泄漏,我不知道它在哪里。
任何人都可以帮我找到它吗?
答案 0 :(得分:0)
问题出在XMLSerializer中,这是设计上的官方行为。
MS Documenation on XMLSerializer
动态生成的程序集
为了提高性能,XML 序列化基础架构动态生成程序集以 序列化和反序列化指定的类型。基础设施发现 并重复使用这些程序集。仅当使用 以下构造函数:
XmlSerializer.XmlSerializer(Type)
XmlSerializer.XmlSerializer(Type, String)
如果您使用其他任何一个 构造函数,将生成同一程序集的多个版本, 永不卸载,这会导致内存泄漏和性能下降。 最简单的解决方案是使用前面提到的两种方法之一 构造函数。否则,您必须将程序集缓存在哈希表中, 如下例所示
并在此处详细了解 XmlSerializer.FromTypes :
答案 1 :(得分:-1)
您应该使用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;
}