内存泄漏在哪里(Serialize对象)

时间:2016-12-01 12:24:30

标签: c# serialization memory-leaks

我有这个方法:

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的简单方法。但是这种方法有内存泄漏,我不知道它在哪里。

任何人都可以帮我找到它吗?

2 个答案:

答案 0 :(得分:0)

问题出在XMLSerializer中,这是设计上的官方行为。

MS Documenation on XMLSerializer

  

动态生成的程序集

     

为了提高性能,XML   序列化基础架构动态生成程序集以   序列化和反序列化指定的类型。基础设施发现   并重复使用这些程序集。仅当使用   以下构造函数:

XmlSerializer.XmlSerializer(Type)    
XmlSerializer.XmlSerializer(Type, String)
  

如果您使用其他任何一个   构造函数,将生成同一程序集的多个版本,   永不卸载,这会导致内存泄漏和性能下降。   最简单的解决方案是使用前面提到的两种方法之一   构造函数。否则,您必须将程序集缓存在哈希表中,   如下例所示

并在此处详细了解 XmlSerializer.FromTypes

XmlSerializer.FromTypes producing memory leaks?

答案 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;
}