首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# 設計強型別自訂設定檔:XML 序列化取代 DataSet 與 XmlDocument

     編輯:關於C#

動機

專案需儲存具邏輯結構的設定資料(如多層選單)。傳統做法:

  • DataSet.WriteXml:操作像資料表,但需先讀文件理解結構,增欄位極不便。
  • XmlDocument:手工操作節點,修改結構時代碼耦合度高、維護困難。

既然 .NET 內建 ConfigurationManager 管理 App.config/Web.config,為何不自行設計強型別設定管理器?

領域模型設計


using System.Collections.Generic;
using System.Xml.Serialization;

public class Menu
{
    public Menu() : this("", "", "") { }
    public Menu(string name, string text, string icon) { Name = name; Text = text; IconName = icon; SubMenus = new SubMenus(); }

    [XmlAttribute("Name")] public string Name { get; set; }
    [XmlAttribute("Text")] public string Text { get; set; }
    [XmlAttribute("IconName")] public string IconName { get; set; }
    public SubMenus SubMenus { get; set; } // 遞迴巢狀
}

public class SubMenus : List { } // 強型別集合

public class MenuStrip
{
    public MenuStrip() { SubMenus = new SubMenus(); }
    public SubMenus SubMenus { get; set; }

    // 載入設定
    public static MenuStrip Load(string path)
    {
        XmlSerializer xs = new XmlSerializer(typeof(MenuStrip));
        using (StreamReader sr = new StreamReader(path))
            return (MenuStrip)xs.Deserialize(sr);
    }

    // 儲存設定
    public void Save(string path)
    {
        XmlSerializer xs = new XmlSerializer(typeof(MenuStrip));
        using (StreamWriter sw = new StreamWriter(path))
            xs.Serialize(sw, this);
    }
}

產生設定檔範例


MenuStrip ms = new MenuStrip();
ms.SubMenus.Add(new Menu("mnuFile", "檔案(&F)", "") {
    SubMenus = { new Menu("mnuNew", "新建", ""), new Menu("mnuSave", "儲存", ""), new Menu("mnuSaveAs", "另存新檔", "") }
});
ms.SubMenus.Add(new Menu("mnuEdit", "編輯(&E)", "") {
    SubMenus = { new Menu("mnuCopy", "複製", ""), new Menu("mnuDel", "刪除", ""), new Menu("mnuCut", "剪下", "") }
});
ms.SubMenus.Add(new Menu("mnuView", "檢視(&V)", ""));
ms.Save(@"...\Menu.Config");

產出的 XML 結構




  
    
      
        
        
        
      
    
    
      
        
        
        
      
    
    
  

優勢總結

  • 強型別:編譯期檢查,IntelliSense 提示,重構安全。
  • 物件導向操作:像操作記憶體物件一樣增刪改查選單,無需解析 XML 路徑。
  • 無限巢狀:遞迴結構天然支援多層選單。
  • 版本演進友善:新增屬性只需加欄位與 Attribute,舊 XML 反序列化自動忽略新欄位(預設值)。
  • 通用模式:同樣技術可套用至任何結構化設定(權限樹、報表範本、工作流定義等)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved