XmlSerializer和/或StreamWriter没有释放它们的内容

问题描述:

我在流式传输到文件时遇到问题,我确定有一个简单的解决方案,但我正在努力寻找它!我试图做的事情非常简单,我得到一个类的内容并将它们序列化为XML并将它们流式传输到一个文件中。我使用的代码是:XmlSerializer和/或StreamWriter没有释放它们的内容

ObservableCollection<RackItemViewModel> rackVMs = ProjectTree.GetTreeData(); 

XmlSerializer serializer = new XmlSerializer(typeof(RackItem)); 
using (TextWriter tw = new StreamWriter(filename, false)) 
{ 
    foreach (RackItemViewModel VM in rackVMs) 
     serializer.Serialize(tw, VM.RackItem); 
} 

ProjectTree.GetTreeData()只是返回要序列化的数据。如果我运行程序并保存数据,所有数据都按预期工作,则数据将被保存并可通过反序列化读回。我遇到的问题是当我执行多个保存时。如果我将一组数据保存到一个文件,然后将另一组数据保存到另一个文件,则第一个文件是正确的,但第二个文件是第一个文件和第二个文件的拼接!似乎流或XMLSerializer不会在保存之间释放它们的内容。我试过使用writefile而不是Stream,但我仍然遇到同样的问题,我也尝试刷新并关闭流,但这没有任何作用。毋庸置疑,如果我关闭并重新启动应用程序保存它一切正常。 有谁能告诉我我做错了吗?

+0

正如我在下面发布的 - 是否有其他一些代码?由于据我所知,写入一个文件,然后另一个文件需要使用两个独立的StreamWriters,所以我认为你有更多的代码,我们没有看到... – Charleh 2012-08-15 09:44:54

我想我会整理这个线程,因为我已经设法解决这个问题。事实证明,这与数据的序列化或数据流无关。正在写入的数据缓冲区在写入之间没有完全释放数据。我正在检查视图模型对象,但是正在写入的对象(RackItem)没有跟随套件。愚蠢的错误,我的一部分。感谢您的建议。

在写入新文件之前,请尝试刷新流tw.Flush()

+0

可悲的是我试过tw.flush和tw.close哪些没有帮助。上面的代码包含在一个方法(PerformSave)中,该方法通过File,Save菜单调用。用户只需调用一次即可正常工作,然后用不同的数据再次调用它,这就是问题发生的地方。 – Marcus 2012-08-15 10:15:42