我的目标是能够在应用之间共享配置设置。 例如,我希望能够使用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文件。这是一个例子
<?xml version="1.0"?>
<SharedSettings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<ProjectName>test2</ProjectName>
<URL />
<DestUser>test3</DestUser>
<RelScript>D:\Events.dll</ReleaseScript>
</SharedSettings>ttings>
注意最后一行。设置&GT; 在序列化我的课程时我做错了什么?
答案 0 :(得分:16)
看起来之前的运行写出了一个更长的文件。在序列化代码中使用FileMode.OpenOrCreate
不会截断以前的文件,因此会被部分覆盖。
改为使用FileMode.Create
。
请参阅文档here。
答案 1 :(得分:-1)
在序列化设置的代码中,您调用的是fs.Flush()还是fs.Close()?
看起来文件没有正确“关闭”。
例如,看起来你打开和写入的文件中包含了你这次写的更多数据。 (不确定这是否有意义......)因为你没有正确关闭文件,文件不会在正确的位置结束。
让我们看看能否更好地解释......
第一次写文件时,请写下:
"Hello World!"
第二次写入更少的字节,并且不要正确关闭文件。所以,如果你写“嗨鲍勃”。你会得到:
"Hi Bob.orld!"
如果fs.Close()无法解决您的问题,您可以尝试在每次编写之前删除配置文件。
答案 2 :(得分:-1)
学习使用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);
}
不这样做的结果是您没有正确刷新输出流。