[英]XMLSerializer writes invalid XML when serializing a class (Sometimes)
我的目標是能夠在應用程序之間共享配置設置。 例如,我希望能夠使用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>
注意最后一行。 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);
}
不這樣做的結果是您沒有正確刷新輸出流。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.