【问题标题】:Why is using a StreamWriter to write text to a string resulting in nothing being written?为什么使用 StreamWriter 将文本写入字符串导致没有写入任何内容?
【发布时间】:2012-01-18 21:48:06
【问题描述】:

我有以下代码

    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> 声明标签)(与我无法控制的另一个系统集成的公司政策)结束)。

【问题讨论】:

  • 您是在冲洗,还是 autoflush 设置为 true?
  • 它可能默认写入他运行或启动应用程序的目录..
  • @MystereMan:方法签名提供了StreamWriter真正需要的所有流...
  • @MystereMan 你认为stream 是什么?可能是文件或内存流
  • 它正在写入内存或文件,具体取决于此方法之外的某些逻辑,这就是为什么它只需要一个通用的stream

标签: c# xml stream


【解决方案1】:

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

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

【讨论】:

  • 我无法让xml.Declaration = null 工作,因为在保存或写入XDocument 时它似乎仍然被写入,但是刷新作者对我原来的问题有效!
  • @KallDrexx:很难对此发表评论,因为您没有展示任何有关您的 LINQ to XML 代码的内容...如果您可以发布一个简短但完整的程序来演示该问题作为第二个问题,如果你愿意,我可以看看。
  • 打开 stackoverflow.com/questions/8926784/… 并举例说明它不起作用
  • @KallDrexx:奇怪的是,我自己的代码现在给了我不同的结果。很奇怪。
  • 至少我不是唯一一个疯狂的人:)
【解决方案2】:

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

将其包装在 using 块中将为您处理这两个问题。

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

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

【讨论】:

  • using:这也会影响stream 对象,在接受stream 作为参数的函数中,这可能不是一个好的选择。
  • 我不想关闭流,因为这将使它在此方法运行后无法访问
【解决方案3】:

作为一般规则,任何时候您使用实现 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
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-09
    • 2021-12-01
    • 2020-04-28
    • 2011-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多