2009-12-15 43 views
4

我的目標是能夠在應用程序之間共享配置設置。 例如,我希望能夠使用WinForm應用程序來設置和保存設置,並使控制檯應用程序能夠讀取這些設置並按計劃任務運行。 我嘗試的方法是創建一個由Winform應用程序和控制檯應用程序引用的SharedSettings類。在這個類中除了像這樣的公共字符串屬性外沒有什麼。XMLSerializer在序列化類時寫入無效XML(有時)

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> 我在做課程序列化時做了什麼錯誤?

回答

15

它看起來像上一次運行通過寫出一個較長的文件。在序列化代碼中使用FileMode.OpenOrCreate不會截斷前一個文件,因此它會被部分覆蓋。

改爲使用FileMode.Create

請參閱文檔here

+0

另外,OP需要在'using'語句中括住'fs'以確保文件流被刷新和關閉。 – dbc 2018-02-03 19:35:56

-1

在你的代碼序列化您的設置,你是調用fs.Flush()或fs.Close()?

它看起來像文件沒有正確「關閉」。

例如,它看起來像你正在打開和寫入的文件有更多的數據在你這次寫的。 (不知道這是否有意義...)並且因爲您沒有正確關閉文件,文件不會在正確的位置結束。

讓我們看看,如果我可以解釋一下更好......

你寫一個文件,第一次讓說你寫:

"Hello World!" 

了第二遍,你少寫字節,不要」請妥善關閉文件。所以如果你寫「Hi Bob」。你會得到:

"Hi Bob.orld!" 

如果fs.Close()不解決您的問題,您可以delete一個嘗試你寫它之前的配置,每次文件。

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

不這樣做的結果是,你沒有正確沖洗輸出流。

相關問題