﻿# 如何用 C# 撰寫序列化(Serialize)與反序列化(Deserialize)

序列化是個很好用的開發方式，可以將任何繼承於 ISerializable 的 .NET 型別(Type)物件都可以被序列化成 Xml 或其他格式，以便於將複雜的物件資料儲存在資料庫或其他儲存媒體中。

例如說我在在開發後台的時候，將一些原本複雜的版面轉換成比較容易管裡的介面，但複雜的資料輸入我會先儲存成一個 DataTable，然後用 XmlSerializer 將原本這個 DataTable 資料儲存在資料庫的一個欄位中，前台要套版的時候只要從資料庫取出並還原成原本要顯示在頁面上的格式就可以了，一來可以簡化內容管理的複雜度（方便客戶操作，也可以防呆），二來也可以簡化程式開發的複雜度（減少程式碼的數量）。

底下是我寫的一個簡單範例，可以對我寫的一個 Typed DataTable 物件進行序列化與反序列化動作。

備註1: 注意紅字的地方，必須要一致才會序列化成功。  
備註2: dsSpecifications.SpecificationDataTable 是我建立在 App\_Code 底下的一個 Typed DataSet 中的 DataTable 物件。

**1\. 序列化(Serialize)：將一個物件實體轉換成 XML 格式**

>     public static string SpecificationDataTableSerialize(dsSpecifications.SpecificationDataTable dt)  
>     {  
>         System.Xml.Serialization.XmlSerializer ser = new System.Xml.Serialization.XmlSerializer(dt.GetType());
> 
>         StringBuilder sb = new StringBuilder();
> 
>         System.IO.StringWriter writer = new System.IO.StringWriter(sb);
> 
>         ser.Serialize(writer, dt);
> 
>         return sb.ToString();  
>     }

**2\. 反序列化(Deserialize)：將一個 XML 文件轉成物件實體**

>     public static dsSpecifications.SpecificationDataTable SpecificationDataTableDeserialize(string s)  
>     {  
>         dsSpecifications.SpecificationDataTable dt = new dsSpecifications.SpecificationDataTable();
> 
>         // 如果傳入的 s 字串不是有效的 XML 格式的話，會發生 Exception，記得要做好 Error Handling  
>         System.Xml.XmlDocument xdoc = new System.Xml.XmlDocument();  
>         xdoc.LoadXml(s);  
>         System.Xml.XmlNodeReader reader = new System.Xml.XmlNodeReader(xdoc.DocumentElement);  
>         System.Xml.Serialization.XmlSerializer ser = new System.Xml.Serialization.XmlSerializer(dt.GetType());  
>         object obj = ser.Deserialize(reader);
> 
>         return obj as dsSpecifications.SpecificationDataTable;  
>     }

**相關連結**

1.  ISerializable 介面  
    [http://msdn2.microsoft.com/zh-tw/library/system.runtime.serialization.iserializable.aspx](http://msdn2.microsoft.com/zh-tw/library/system.runtime.serialization.iserializable.aspx)  
      
    
2.  XmlSerializer 類別  
    [http://msdn2.microsoft.com/zh-tw/library/system.xml.serialization.xmlserializer.aspx](http://msdn2.microsoft.com/zh-tw/library/system.xml.serialization.xmlserializer.aspx)
