序列化將物件轉換為可儲存/傳輸格式,反序列化還原物件。.NET System.Xml.Serialization 提供人類可讀、跨平台相容的 XML 序列化,適用於 Web Services、遠端呼叫、設定檔持久化。本文涵蓋核心類別、屬性控制、基本操作、忽略屬性、巢狀物件序列化、設定檔應用與面向物件資料庫的延伸思路。
| 類別/屬性 | 命名空間 | 用途 |
|---|---|---|
XmlSerializer | System.Xml.Serialization | 序列化/反序列化引擎 |
XmlIgnoreAttribute | System.Xml.Serialization | 標記略過序列化的成員 |
XmlAttributeAttribute | System.Xml.Serialization | 將屬性序列化為 XML 屬性而非元素 |
XmlElementAttribute | System.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);
優點:
概念架構:
XmlDocument 載入整份文件XPath 選取節點 → XmlSerializer 反序列化為物件XmlDocument 替換節點 → 儲存Dictionary<string, XmlNode> 對應作者嘗試在 200 行 C# 內實現完整功能,展示 XML 序列化超越單純持久化的潛力。
XmlSerializer 建構函式會動態生成組件 (首次較慢),建議靜態快取實例XmlReader/Writer 流式處理DataContractSerializer (支援 IsReference=true)