为什么使用StreamWriter将文本写入字符串,导致什么也没写

本文关键字:什么 字符串 StreamWriter 文本 为什么 | 更新日期: 2023-09-27 18:20:37

我有以下代码

    public void SerializeToStream(Stream stream)
    {
        var xml = // Linq to xml code here
        // Write to the stream
        var writer = new StreamWriter(stream);
        writer.Write(xml.ToString());
    }

我的xml对象具有正确的数据,并且我已经验证了xml.ToString()正确地显示了所有内容,但在调用writer.Write(xml.ToString())之后,我的传入流(无论它是FileStream还是MemoryStream)中仍然没有任何内容(长度为零)。没有抛出异常。为什么会发生这种情况?

需要注意的是,我不能使用xml.WriteTo(),因为XmlWriter类添加了额外的东西(<xml>声明标记),而我不能在xml中使用这些东西(与我无法控制的另一个系统集成的公司策略)。

为什么使用StreamWriter将文本写入字符串,导致什么也没写

您永远不会刷新或关闭写入程序。(我通常建议关闭写入程序,但这也会关闭流,这可能不是你想要的。)只需添加:

writer.Flush();

在方法的末尾。

请注意,如果需要,可以从XDocument中删除XML声明。例如:

XDocument doc = new XDocument
    (new XDeclaration("1.0", "utf-8", "yes"),
     new XElement("Root", "content"));
doc.Save(Console.Out); // Includes <? xml ... ?>
doc.Declaration = null;
doc.Save(Console.Out); // No declaration...

这应该会让它变得更简单:

public void SerializeToStream(Stream stream)
{
    var xml = // Linq to xml code here
    xml.Declaration = null;
    xml.Save(stream);
}

我敢打赌,这是因为您没有关闭StreamWriter;冲洗也可能起作用。

把它包在一个使用块里会照顾到你。

...
    using (var writer = new StreamWriter(stream))
    {
        writer.Write(xml.ToString());
    }
...

注意(来自@Tigran):using:这也会影响流对象,在接受流(如参数)的函数中,这可能不是一个好的选择。

一般来说,任何时候使用实现IDisposable接口的类时,都应该将其封装在using块中。这样可以确保在对象超出范围之前调用.Close()方法,从而释放资源。我还注意到,如果结尾没有.Flush(),内容并不总是能写出来。

http://msdn.microsoft.com/en-us/library/yh598w02.aspx

using (var writer = new StreamWriter(stream))
{
    writer.Write(xml.ToString());
    writer.Flush();
    // writer.Close() can be called here, but is automatically called at the end of the using block
}