我有以下代码
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中使用这些东西(与我无法控制的另一个系统集成的公司策略)。
您永远不会刷新或关闭写入程序。(我通常建议关闭写入程序,但这也会关闭流,这可能不是你想要的。)只需添加:
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
}