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

C# XML 序列化與反序列化實戰:XmlSerializer 完整操作指南

     編輯:關於C語言

前言

在 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}";
}

序列化:物件寫入 XML 檔案

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 檔案寫入成功。");
}

反序列化: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 結構範例

<?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 預先生成序列化組件。
  • 異常處理:反序列化時若 XML 結構不符,會拋出 InvalidOperationException,務必包裝 try-catch 並記錄詳細錯誤訊息。

執行結果展示

XML 序列化與反序列化執行結果

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved