上一篇探討了通用的XML讀寫配置,有了一點改進,但還不夠通用,希望有一個類似“萬能工具類”的東西,能夠方便的對所有要儲存和配置的XML資料都進行讀寫,而且資料本身並不需要知道XML檔案的儲存細節。這看起來很不錯,但似乎又不太可能。後來想到了.Net的反射(Reflection),於是有了一個思路: 寫入XML檔案時,通過反射擷取資料對象的公有欄位資訊(FieldInfo)和欄位值,根據類名和欄位名自動構造XML節點結構,並儲存對應的值。讀取XML時,根據資料對象的欄位資訊來尋找對應的同名XML節點,並將該節點儲存的內容賦值給對應的欄位。
這樣一來,資料對象的定義不必再附加XML節點資訊,實現徹底與XML結構和儲存細節相脫離,資料類只要關心自身的職能和商務邏輯即可。繼續上一篇中的樣本,則類圖變化為:
有了這個“萬能工具類”XmlStorageHelper,我們就可以方便的把資料儲存到XML中並讀取出來,理論上這個資料可以是任何類型,甚至是一個數組對象。
範例程式碼如下:
代碼
XmlStorageHelper xmlHelper = new XmlStorageHelper();
//儲存對象到檔案
DataBase db = new DataBase();
xmlHelper.SaveToFile(db, "d:\\mytest.xml");
//從檔案中讀取資料
DataBase db2 = new DataBase();
xmlHelper.LoadFromFile(db2, "d:\\mytest.xml");
//將資料轉化為XML字串
string xmlStr = xmlHelper.ConvertToString(db2);
總結:
1.在工具類XmlStorageHelper的實現過程中,遇到並解決了以下幾個痛點:
A.欄位為自訂類型
B.欄位類型為數組或者集合類型
C.欄位類型為字典類型(Dictionary)
2.XmlStorageHelper只儲存非靜態公有欄位(Public)的值,不儲存其它存取權限的欄位。
3.XmlStorageHelper不儲存函數和屬性(Property),不管它們是否為Public。
4.目前基本支援Framework2.0裡的集合類型及其泛型,但如果使用自訂的集合類型(比如繼承自IList)可能會有問題,尚未驗證非常複雜的集合巢狀型別,比如List<List<Dictionary<int,string>>>這樣的複雜集合。
實現原始碼下載:XmlStorageHelper.cs
樣本工程下載:CommonXmlConfigV2.rar