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

时间:2009-12-15 19:37:58

标签: c# xml-serialization

我的目标是能够在应用之间共享配置设置。 例如,我希望能够使用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; 在序列化我的课程时我做错了什么?

3 个答案:

答案 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);
    }

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