2009-02-23 85 views
1

我在.NET中有一組自定義的XML配置管理類。對多個XML配置文件進行序列化/反序列化

有我的應用程序兩種配置範圍:

用戶:設置適用於用戶無論她登錄到帳戶。存儲在用戶目錄中的XML配置文件中。

用戶/帳戶:該設置適用於登錄到特定帳戶時的用戶。存儲在帳戶特定子目錄下用戶目錄中的XML配置文件中。

這兩個XML文檔具有相同的結構,可以手動修改。當應用程序啓動時,我從用戶的配置文件中讀取XML配置,並從用戶/帳戶目錄中讀取XML配置。然後,我將兩個XML文檔合併到一個單獨的XDocument中,然後將XML反序列化爲在XDocument的部分之後建模的對象。如果存在用戶/帳戶級別設置,則應覆蓋用戶級別設置。例如:

用戶文件:

<FileSettings> 
    <DownloadPath>C:\downloads</DownloadPath> 
    <UploadPath>C:\uploads</UploadPath> 
</FileSettings> 

用戶/帳戶XYZ帳戶文件:合併後

<FileSettings> 
    <DownloadPath>C:\newlocation\xyz\mystuff</DownloadPath> 
</FileSettings> 

結果:

<FileSettings> 
    <DownloadPath>C:\newlocation\xyz\mystuff</DownloadPath> 
    <UploadPath>C:\uploads</UploadPath> 
</FileSettings> 

在上面的示例中,具有2個屬性的FileSettings對象 - DownloadPath和UploadPath將從該部分實例化。

這是我的問題:我不知道DownloadPath和UploadPath來自哪個配置文件(即範圍)。因此,當對象需要再次序列化時,它不知道哪個文件中包含哪些屬性。

問題:在每個屬性的基礎上存儲「源」的最佳方式是什麼,以便我可以確保將設置寫入到與讀取的配置文件相同的配置文件中?

謝謝。

回答

2

合併後,是否可以附加每個屬性的值來源?

<FileSettings> 
    <DownloadPath>C:\newlocation\xyz\mystuff</DownloadPath> 
    <UploadPath>C:\uploads</UploadPath> 
    <DownloadPathSrc>xyz</DownloadPathSrc> 
    <DownloadPathSrc>user</DownloadPathSrc> 
</FileSettings> 

如果是這樣,這兩個SRC屬性可以反序列化到您的FileSettings對象, 之前系列化再次文件,您可以爲每個源的全新FileSetting對象沒有設定* SRC屬性,通過默認的空字符串不會被XmlSerializer序列化。通過src屬性,您可以知道要將哪個文件序列化到哪個文件。如果你想添加src作爲元素的屬性。這實際上也是我的初衷,但是,您需要爲每個屬性創建類。例如在FileSetting類

[XmlType()] 
public class DownloadPath 
{ 
    [XmlAttribute] 
    public string Src; 
    [XmlText] 
    public string Text; 
} 
// serialize to 
<DownloadPath Src="...">text</DownloadPath> 
+0

這是我最初的想法。我打算做 C:\ path。但是我不確定如何在對象反序列化時將它表示出來。我想避免爲對象中的每個屬性都設置相應的源屬性。 – 2009-02-23 16:36:55

1

財產DownloadPath我寧願一些屬性添加到像這樣的XML:

<FileSettings> 
    <DownloadPath src="Account">C:\newlocation\xyz\mystuff</DownloadPath> 
    <UploadPath src="User">C:\uploads</UploadPath> 
</FileSettings> 

它更容易實現內容的分離層。