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

eto*_*bot 5 c# xml-serialization

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

public class SharedSettings
{
    public string URL { get; set; }
    public string DestUser { get; set; }
    public string RelScript { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我使用以下序列来序列化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); 
Run Code Online (Sandbox Code Playgroud)

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

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;
Run Code Online (Sandbox Code Playgroud)

每隔一段时间,每五次一次,我就会运行在无效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>
Run Code Online (Sandbox Code Playgroud)

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

And*_*ngs 17

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

FileMode.Create改用.

请参阅此处的文档.