2009年6月5日 星期五

c# Serialize的簡單範例 & binary和xml存檔方式比較

C# 的Serialize功能能讓我們很容易的幫自訂類別進行存檔
一般Serialize有2種作法 一種是存成binary 一種是存成xml
網路上的範例都太複雜了 基本的作法如下 幾行程式碼而已
首先 當然你的class要有[Serializable]的標籤

ex:
[Serializable]
public class myclass
{
public string text;
public int number;
public float number2;
public myclass()
{
text = "abc";
number = 3;
number2 = 12.34;
}
}
myclass myobj=new myclass();

然後兩種作法的讀寫範例程式碼如下 看你是要存成binary還是存成xml:

binary存檔

IFormatter binFmt = new BinaryFormatter();
Stream s = File.Open("binary存檔檔名", FileMode.Create);
binFmt.Serialize(s, myobj);
s.Close();

binary讀檔

IFormatter binFmt = new BinaryFormatter();
Stream s = File.Open("binary存檔檔名", FileMode.Open);
myobj = (myclass)binFmt.Deserialize(s);
s.Close();

------

xml存檔

System.Xml.Serialization.XmlSerializer ser = new System.Xml.Serialization.XmlSerializer(myobj.GetType());
Stream s = File.Open("xml存檔檔名", FileMode.Create);
ser.Serialize(s, myobj);
s.Close();

xml讀檔

System.Xml.Serialization.XmlSerializer ser = new System.Xml.Serialization.XmlSerializer(myobj.GetType());
Stream s = File.Open("xml存檔檔名", FileMode.Open);
myobj = (myclass)ser.Deserialize(s);
s.Close();

======

binaryxml存檔方式的比較

binary較省空間 但可維護性較差 移植性也比較差 存檔只能由程式開啟
若遺失了原始的class定義 資料很難parse回來 因為是二進位格式
而xml存檔格式較通用 即使本來的程式遺失了仍然可透過xml parser把存檔中的子元素救回來
使用者也可直接透過記事本或xml editer編輯存檔裡的元素 不需透過特定程式
但是xml檔案所佔容量較大 且並非所有.NET原生物件都能存成xml
某些型別在Serialize成xml時會有問題
例如Font , Color等高階型別只能由binary寫入 透過XML方式寫入會產生執行時期錯誤
(這方面應該是.NET函式庫沒做好 技術上來說那些高階型別存成xml並不是不可能 或許有其他原因是我不知道的)

相關文章: c# serizable碰到的小問題