在 C# 開發中,將物件圖與 XML 檔案互相轉換是資料持久化與交換的常見需求。System.Xml.Serialization.XmlSerializer 提供了強型別、聲明式的序列化機制,只要類別結構與 XML Schema 嚴格對應,即可輕鬆完成寫入與讀取。本文將以 List<UserInfo> 為例,示範完整的序列化至檔案與反序列化還原物件的流程。
public class UserInfo
{
public int Id { get; set; }
public string UserName { get; set; }
public string UserPass { get; set; }
public string Email { get; set; }
public DateTime RegTime { get; set; }
public override string ToString()
=> $"{Id}\t{UserName}\t{UserPass}\t{Email}\t{RegTime}";
}
private static void WriteXml(List<UserInfo> users, string filePath)
{
var serializer = new XmlSerializer(typeof(List<UserInfo>));
using (var fs = File.OpenWrite(filePath))
{
serializer.Serialize(fs, users);
}
Console.WriteLine("XML 檔案寫入成功。");
}
private static List<UserInfo> ReadXml(string filePath)
{
var serializer = new XmlSerializer(typeof(List<UserInfo>));
using (var fs = File.OpenRead(filePath))
{
return (List<UserInfo>)serializer.Deserialize(fs);
}
}
static void Main()
{
var userList = new List<UserInfo>
{
new UserInfo { Id = 1, UserName = "張三", UserPass = "FDASDFAS", Email = "zhangsan@163.com", RegTime = DateTime.Now },
new UserInfo { Id = 2, UserName = "李四", UserPass = "FDASDFAS", Email = "lisi@163.com", RegTime = DateTime.Now },
// ... 更多測試資料
};
const string xmlFile = "UserInfo.xml";
WriteXml(userList, xmlFile);
var restored = ReadXml(xmlFile);
restored.ForEach(Console.WriteLine);
Console.WriteLine("反序列化成功。");
Console.ReadKey();
}
<?xml version="1.0"?>
<ArrayOfUserInfo xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="https://www.w3.org/2001/XMLSchema">
<UserInfo>
<Id>1</Id>
<UserName>張三</UserName>
<UserPass>FDASDFAS</UserPass>
<Email>zhangsan@163.com</Email>
<RegTime>2016-04-21T09:15:58.5576551+08:00</RegTime>
</UserInfo>
<!-- 更多 UserInfo 節點 -->
</ArrayOfUserInfo>
public,且擁有公有的無參建構函式;唯讀屬性或私有 setter 會被忽略。[XmlRoot]、[XmlElement]、[XmlAttribute] 等屬性自訂 XML 節點名稱與命名空間。XmlSerializer 首次建構時會動態產生組件,建議在應用程式啟動時預先實例化或使用 sgen.exe 預先生成序列化組件。InvalidOperationException,務必包裝 try-catch 並記錄詳細錯誤訊息。