XMLSerializer在序列化类时写入无效的XML(有时候)

我的目标是能够在应用程序之间共享配置设置。 例如,我希望能够使用WinForm应用程序来设置和保存设置,并让控制台应用程序能够读取这些设置并作为计划任务运行。 我尝试的方法是创建一个由Winform应用程序和控制台应用程序引用的SharedSettings类。 在这个类中,只有像这样的公共字符串属性。

public class SharedSettings { public string URL { get; set; } public string DestUser { get; set; } public string RelScript { get; set; } } 

我使用以下命令序列化SharedSettings类的实例

 SharedSettings settings = new SharedSettings(); settings.RelScript = this.txtRelScript.Text; settings.URL = this.txtURL.Text; settings.DestUser = this.txtDestUser.Text; XmlSerializer dehydrator = new XmlSerializer(settings.GetType()); System.IO.FileStream fs = new FileStream(this.configFilePath, FileMode.OpenOrCreate); dehydrator.Serialize(fs, settings); 

并将其反序列化并填充表单中的字段

 SharedSettings settings = new SharedSettings(); XmlSerializer dehydrator = new XmlSerializer(settings.GetType()); System.IO.FileStream fs = new FileStream(this.configFile, FileMode.Open); settings = (SharedSettings)dehydrator.Deserialize(fs); this.txtRelScript.Text = settings.RelScript; this.txtURL.Text = settings.URL; this.DestUser.Text = settings.DestUser; 

每隔一段时间,每五次一次,我就会运行在无效XML中创建的XML文件。 这是一个例子

   test2  test3 D:\Events.dll ttings> 

注意最后一行。 ttings>在序列化我的课程时我做错了什么?

它看起来像以前的运行写出了一个更长的文件。 在序列化代码中使用FileMode.OpenOrCreate不会截断以前的文件,因此会被部分覆盖。

请改用FileMode.Create

请参阅此处的文档。

在您的代码序列化您的设置,您是否调用fs.Flush()或fs.Close()?

看起来文件没有正确“关闭”。

例如,看起来你正在打开和写入的文件中包含了你这次写的更多数据。 (不确定这是否有意义……)并且因为您没有正确关闭文件,文件不会在正确的位置结束。

让我们看看我是否可以更好地解释……

第一次写文件时,请写下:

 "Hello World!" 

第二次写入较少的字节,并且不要正确关闭文件。 所以,如果你写“嗨鲍勃”。 你会得到:

 "Hi Bob.orld!" 

如果fs.Close()无法解决您的问题,您可以尝试在每次编写之前删除配置文件。

学习using块:

  SharedSettings settings = new SharedSettings(); settings.RelScript = this.txtRelScript.Text; settings.URL = this.txtURL.Text; settings.DestUser = this.txtDestUser.Text; XmlSerializer dehydrator = new XmlSerializer(settings.GetType()); using (System.IO.FileStream fs = new FileStream(this.configFilePath, FileMode.OpenOrCreate)) { dehydrator.Serialize(fs, settings); } 

不这样做的结果是您没有正确刷新输出流。