我试图从一个方法返回一个SqlXml对象,该方法使用一个方法本地内存流对其进行初始化。也就是说。
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对象并安全地处理内存流?
编辑:
一种可能的解决方案是使用temp SqlXml变量,然后使用它通过create reader构造函数初始化返回对象:
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());
}
}但在我看来,这仍然有点笨拙。
发布于 2014-09-27 02:16:41
当块退出时,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);
}
}https://stackoverflow.com/questions/26022660
复制相似问题