我正在使用以下代码获取XML字符串。
public static string ToXMLString(object obj, string nodeName)
{
XmlSerializer xmlSerializer = default(XmlSerializer);
string xml = string.Empty;
StreamReader r = default(StreamReader);
try
{
if (obj != null)
{
using (MemoryStream m = new MemoryStream())
{
using (XmlWriter writer = XmlWriter.Create(m, new XmlWriterSettings() { OmitXmlDeclaration = true, Indent = true }))
{
// Don't include XML namespace
XmlSerializerNamespaces xmlnsEmpty = new XmlSerializerNamespaces();
xmlnsEmpty.Add("", "");
if (xmlSerializer == null)
xmlSerializer = new XmlSerializer(obj.GetType(), new XmlRootAttribute(nodeName));
xmlSerializer.Serialize(writer, obj, xmlnsEmpty);
m.Flush();
m.Position = 0;
r = new StreamReader(m);
xml = r.ReadToEnd();
xmlSerializer = null;
}
}
}
return xml;
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
throw;
}
finally
{
r.Close();
r.Dispose();
}
//XmlSerializer xmlSerializer;
}
我有一个使用方法运行的循环,在一段时间后,我会得到以下内存溢出异常:
这个异常的原因是什么?使用语句确实释放了流吗?还是我可以使用其他替代方案?
xmlSerializer
赋值为null
没有任何好处;我只是在行内声明,即var xmlSerializer = new XmlSerializer(...);
。你没有处理读取器的释放,但这里不会对你造成影响。实际上,如果你只想要字符串,你可以写入到StringBuilder
中 - 避免与Stream
打交道... - Marc Gravellusing
块退出时,会调用IDisposable.Dispose()
方法。因此,您代码的这一部分是正确的。 - C.Evenhuisdefault(StreamReader)
语法吗?此外,你正在覆盖r
而没有处理先前的实例。它将会超出范围并被垃圾收集,但不如显式处理释放的那么快。 - Kevin P. Rice