返回使用内存流初始化的SqlXml

时间:2014-09-24 17:08:18

标签: c# xml

我试图从一个使用方法本地内存流初始化它的方法返回一个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对象并安全地处理内存流?

编辑:

一种可能的解决方案是使用临时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());
            }
        }

但这对我来说仍然看起来有点笨拙。

1 个答案:

答案 0 :(得分:0)

当块退出时,using语句将在流上调用dispose。将MemoryStream从use-block中取出,在返回之前不会进行处理。

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);
    }
}