簡體   English   中英

XMLSerializer在序列化類時寫入無效的XML(有時候)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM