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); }
不这样做的结果是您没有正确刷新输出流。