我试图从使用方法本地内存流初始化它的方法返回一个 SqlXml 对象。 IE。
using (Stream memoryStream = new MemoryStream())
{
using (XmlWriter writer = XmlWriter.Create(memoryStream, new XmlWriterSettings { OmitXmlDeclaration = true }))
{
serializer.Serialize(writer, myList.ToArray(), ns);
return new SqlXml(memoryStream);
}
}
现在调用它并尝试访问它的字段的方法因
object disposed exception
失败。我快速浏览了 SqlXml.cs 并看到它只是保持对描述行为的流的引用。
public SqlXml(Stream value) {
// whoever pass in the stream is responsible for closing it
// similar to SqlBytes implementation
if (value == null) {
SetNull();
}
else {
firstCreateReader = true;
m_fNotNull = true;
m_stream = value;
}
我真的很想避免调用者必须传递流并对其生命周期负责。有没有其他方法可以完全初始化 SqlXml 对象并安全地处理内存流?
编辑:
一种可能的解决方案是拥有一个临时 SqlXml 变量,然后使用它通过创建读取器构造函数来初始化返回对象:
using (Stream memoryStream = new MemoryStream())
{
using (XmlWriter writer = XmlWriter.Create(memoryStream, new XmlWriterSettings { OmitXmlDeclaration = true }))
{
serializer.Serialize(writer, myList.ToArray(), ns);
SqlXml s = new SqlXml(memoryStream);
return new SqlXml(s.CreateReader());
}
}
但这对我来说仍然看起来有点笨拙。
最佳答案
块退出时,using语句将在流上调用dispose。将MemoryStream从using块中取出,并且在返回之前将不会对其进行处置。
class Program
{
static void Main(string[] args)
{
var s = GetData();
var r = s.CreateReader();
while (r.Read())
{
if (r.NodeType == XmlNodeType.Element)
{
System.Console.WriteLine(r.Name);
}
}
r.Close();
}
private static SqlXml GetData()
{
var mem = new MemoryStream();
//TODO: Deserialize or query data.
return new SqlXml(mem);
}
}