C# 序列化程序中是否存在内存泄漏

C# 序列化程序中是否存在内存泄漏,c#,.net,C#,.net,在下面的代码中,代码中是否有任何部分会导致内存泄漏? XmlSerializer会导致内存泄漏吗 public static string Serializer<T>(T tag, Encoding encoding = null) { if (encoding == null) encoding = Encoding.UTF8; MemoryStream memoryStream = null; tr

在下面的代码中,代码中是否有任何部分会导致内存泄漏? XmlSerializer会导致内存泄漏吗

public static string Serializer<T>(T tag, Encoding encoding = null)
    {
        if (encoding == null)
            encoding = Encoding.UTF8;

        MemoryStream memoryStream = null;
        try
        {
            StringBuilder xmlBuilder = new StringBuilder();
            memoryStream = new MemoryStream();
            using (StreamWriter streamWriter = new StreamWriter(memoryStream, encoding))
            {
                XmlSerializer serializer = new XmlSerializer(tag.GetType());
                serializer.Serialize(streamWriter, tag);

                using (StreamReader streamREader = new StreamReader(memoryStream, encoding))
                {
                    memoryStream.Position = 0;
                    xmlBuilder.Append(streamREader.ReadToEnd());
                }
            }
            return xmlBuilder.ToString();
        }
        catch (Exception ex)
        {
            logger.Error("{0} {1}", "Serializer failed ", ex);
            return null;
        }
    }
公共静态字符串序列化程序(T标记,编码=null)
{
if(编码==null)
encoding=encoding.UTF8;
MemoryStream MemoryStream=null;
尝试
{
StringBuilder xmlBuilder=新的StringBuilder();
memoryStream=新的memoryStream();
使用(StreamWriter StreamWriter=新StreamWriter(memoryStream,编码))
{
XmlSerializer serializer=新的XmlSerializer(tag.GetType());
serializer.Serialize(streamWriter,标记);
使用(StreamReader StreamReader=新StreamReader(memoryStream,编码))
{
memoryStream.Position=0;
Append(streamREader.ReadToEnd());
}
}
返回xmlBuilder.ToString();
}
捕获(例外情况除外)
{
错误(“{0}{1}”,“序列化程序失败”,ex);
返回null;
}
}
任何想法。

您没有处理您在6日声明的“memoryStream”


还有一件事:在GC通过之前,您不会看到内存间隙恢复。。。您可以检查是否使用

,需要注意的是,手动强制GC执行其工作可能会有问题/导致轻微的性能问题。在99.99999%的情况下,等待它确定它需要自己运行是可以的。是的!对的你应该这样做只是为了确认没有泄漏,即使在那里,也不是100%安全的方法!如果需要手动执行GC,则很可能存在其他问题。(如不处理
memoryStream
)MemeoryStream.Dispose()不处理任何内容。这是一个哑弹,由基类流强加。它与OP的任何内存问题无关。@bommelding:
MemoryStream
在这方面是不寻常的,是的,没有什么真正阻止您这样做,但我也看不出有任何意义。首先,最好使用
using
语句处理本地构造的一次性实例。大多数静态代码分析器都会抱怨没有处理对象,在代码审查期间,您还有一件事要解释。其次,应该几乎总是避免访问已处置对象的成员。因此,如果我真的需要返回缓冲区,我宁愿
使用(var ms=MemoryStream()){x=ms.ToArray();}
一周中的任何一天。@groo-这偏离了这里的点,这是错误的假设,如下面的答案所示。查看为什么ToArray()应该位于使用@jerisebastian的
之后-这里删除了一些有用的注释,您看到关于生成的程序集的注释了吗?你应该对此作出回应。目前您的问题不清楚。@bommelding:您的链接答案没有意义:处理
内存流有意义。也许OP的
LZ4Stream
对dispose做了一些刷新,但是声称
ToArray()
必须在dispose
MemoryStream
之后进行,这是不正确的。@Henkholtman这不是我的代码片段,但我仍然想在获得数组之前听听处理
MemoryStream
的原因。
Dispose
方法不做任何与数组相关的事情。向新手程序员(大概是)提供建议,建议您应该在处理后访问实例,这是一种糟糕的做法。