繁体   English   中英

内存泄漏在哪里(序列化对象)

[英]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中,这是设计上的官方行为。

MS在XMLSerializer上的文档

动态生成的装配体

为了提高性能,XML序列化基础结构动态生成程序集以序列化和反序列化指定的类型。 基础结构查找并重用这些程序集。 仅当使用以下构造函数时,才会发生此现象:

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

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

并在此处阅读有关XmlSerializer.FromTypes的更多信息

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM