作者: Tomex Ou
版本歷史:
72008-12-28 PM 23:54:14 簡易且有保護功能的config類別。
研究動機
應用程式的組態檔,通常可以用App.config、INI、XML或者是二進位序列化檔(Binary Serialization)來實作。然而,App.config適合唯讀型(因安全限制),INI存放機制太陽春且沒官方類別存取,二進位序列化檔雖方便但受限AssemblyName得一致的缺點,都不太適合當一個AP的設定檔。這時候簡易型的xml設定檔很就適合,加上字串加密的機制,就具有半加密式的保護功能。
實作方式
要讀寫一個xml檔,初學者很容易用簡易型的XmlDocument+XPath類別來操作,但它使用DOM效能不佳,筆者強烈推薦養成習慣,使用XmlReader/Writer類別來操作。另更簡易的方式是使用XmlTextReader/Writer來操作XML,透過ReadToFollowing("NodeName")很容易就能跳躍到想要的節點上。
下圖就是我們要設計的簡易config.xml檔內容:

每個entry項目name不重複,有屬性Encrypted代表內容是曾有加密,方便讀解時判別。第5行是加密的內容,可以使用各類AES對稱式加密法來實作,也因為它的Base64加密字串是不等長且可能出現任何字元,因此節點內容我們用CDATA關鍵字來防止xml逸出字元的衝突。
類別設計
為了方便操作xml節點內容值,我們應該用一個類別來代表這份xml檔案,最基本是具有Xml節點異動函式。您可以用上述的XmlReader/Writer來實作,更高竿的作法是繼承IXmlSerializable介面,去實作ReadXml()/WriterXml()函式,但這邊就不採用這樣的方式,而是利用DataTable+XmlReader/Writer來控制讀寫動作,其中使用物件Index方式:

我們不讓Entry名稱重複,並實作了自動解密字串的功能,最後類別操作如下圖:

文章結論
本篇技術難點不高,說穿了只是xml+加密+類別操作的優化,不過很適合作為ap的簡易設定xml檔,也是xml讀寫應用的範例。