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

.NET XML 序列化完整指南:從基礎操作到設定檔持久化與物件資料庫雛形

     編輯:關於.NET

序列化將物件轉換為可儲存/傳輸格式,反序列化還原物件。.NET System.Xml.Serialization 提供人類可讀、跨平台相容的 XML 序列化,適用於 Web Services、遠端呼叫、設定檔持久化。本文涵蓋核心類別、屬性控制、基本操作、忽略屬性、巢狀物件序列化、設定檔應用與面向物件資料庫的延伸思路。

核心類別與屬性

類別/屬性命名空間用途
XmlSerializerSystem.Xml.Serialization序列化/反序列化引擎
XmlIgnoreAttributeSystem.Xml.Serialization標記略過序列化的成員
XmlAttributeAttributeSystem.Xml.Serialization將屬性序列化為 XML 屬性而非元素
XmlElementAttributeSystem.Xml.Serialization控制元素名稱、命名空間、順序

基本序列化與反序列化

// 序列化
var customer = new Customer { FirstName = "Zach", LastName = "Smith" };
var serializer = new XmlSerializer(typeof(Customer));
using (var writer = new StringWriter()) {
    serializer.Serialize(writer, customer);
    Console.WriteLine(writer.ToString());
}

// 反序列化
using (var file = File.OpenRead("customer.xml")) {
    var customer = (Customer)serializer.Deserialize(file);
}

輸出範例與屬性控制

<?xml version="1.0" encoding="utf-16"?>
<Customer xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="https://www.w3.org/2001/XMLSchema">
  <Orders />
  <LastName>Smith</LastName>
  <FirstName>Zach</FirstName>
</Customer>
  • 公用屬性/欄位預設序列化
  • 私有成員不序列化
  • 無參數建構函式**必要**,否則拋出例外
  • [XmlIgnore] 標記的 Income 屬性**完全不出現在 XML 中**,反序列化時為預設值

巢狀集合序列化

public class Customer {
    public List<Order> Orders { get; set; } = new List<Order>();
    // ...
}
public class Order { public decimal Total { get; set; } }

輸出:

<Orders>
  <Order><Total>34.56</Total></Order>
  <Order><Total>156.56</Total></Order>
</Orders>

集合自動展開為同名元素序列,反序列化自動重建列表。

實用場景:應用程式設定檔持久化

替代手寫 XML 解析:

public class AppSettings {
    public string LastOpenedFolder { get; set; }
    public int WindowWidth { get; set; }
    public int WindowHeight { get; set; }
    public List<string> RecentFiles { get; set; } = new List<string>();
}

// 儲存
using (var writer = new StreamWriter("settings.xml")) 
    new XmlSerializer(typeof(AppSettings)).Serialize(writer, settings);

// 載入
using (var reader = new StreamReader("settings.xml"))
    settings = (AppSettings)new XmlSerializer(typeof(AppSettings)).Deserialize(reader);

優點:

  • 零解析代碼,強型別存取
  • 人工可編輯 (記事本即可修改)
  • 版本演進相容 (新增屬性預設值、缺失屬性忽略)

延伸:XML 序列化 + XPath + Predicate = 物件資料庫雛形

概念架構:

  1. 每個物件類型對應一個 XML 檔案 (或單一檔案多區段)
  2. XmlDocument 載入整份文件
  3. 查詢:XPath 選取節點 → XmlSerializer 反序列化為物件
  4. 更新:修改物件 → 序列化 → XmlDocument 替換節點 → 儲存
  5. 索引:維護關鍵欄位的 Dictionary<string, XmlNode> 對應

作者嘗試在 200 行 C# 內實現完整功能,展示 XML 序列化超越單純持久化的潛力。

效能與限制提醒

  • 啟動開銷:XmlSerializer 建構函式會動態生成組件 (首次較慢),建議靜態快取實例
  • 大型物件圖:記憶體佔用高,考慮 XmlReader/Writer 流式處理
  • 循環參考:不支援,需手動斷開或使用 DataContractSerializer (支援 IsReference=true)
  • 版本容錯:缺失元素/屬性自動忽略,新增元素自動略過,適合演進式介面
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved