2009年5月5日 星期二

序列化(Serialization)

其實看到這個詞已經很久了,但是常常覺得似懂非懂...

今天總算找了一點時間了解這個序列化有何作用。

其實它主要的作用就是為了讓程式保留物件的狀態傳送至目的端,而目的端能夠了解傳送來的物件是什麼。

這對於 OO 來說是一件很重要的事,畢竟,我們自己如果還要花費大量的力氣在傳遞資料以及轉換資料實在是太囧了!

實作序列化常見的有兩種作法:

  1. 使用 Serializable 特徵項與 Formatter 類別

  2. 使用 XmlSerializer 類別(不建議使用)


但是我們要怎麼賦予物件可序列化呢?在此假設我們有一個產品資料(Product)需要傳送給目的端,
作法如下所示:

一、使用 Serializable 特徵項與 Formatter 類別
首先,我們在Product這個類別的上方插入 Serializable (可序列化)特徵項,
這個特徵項位於System.Runtime.Serialization下,當我們要序列化之前需先引用此套件。

using System.Runtime.Serialization;

[Serializable]
public class Product
{
public int ID; //產品編號
public string name; //產品名稱
public double price; //產品單價

public Product(int ID, string name, double price){
this.ID = ID;
this.name = name;
this.price = price;
}
}

經由上述的宣告,我們的產品類別就已經成為可序列化的類別,而要讓它能夠實際序列化需要藉由Formatter來轉換。
Formatter有兩個實作的類別,分別為BinaryFomatter和SoapFormatter,底下我們實作此兩者要怎麼使用。

using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
...

public class App
{
private void btnSerialize_Click(object sender, System.EventArgs e)
{
Product p = new Product(1, "運動飲料", 25.0);

IFormatter formatter = new BinaryFormatter();

FileStream fs = new FileStream(@"c:\test.txt", FileMode.Create);

formatter.Serialize(fs, p);

fs.Close();
}

private void btnDeserialize_Click(object sender, System.EventArgs e)
{
FileStream fs = new FileStream(@"c:\test.txt", FileMode.Open);

IFormatter formatter = new BinaryFormatter();

Product p = (Product) formatter.Deserialize(fs);

MessageBox.Show(p.name);

fs.Close();

}
}

二、使用 XmlSerializer 類別
使用XmlSerilzer需引用System.Xml.Serialization,然而XmlSerilizer的作法與上述相似,在此不多做介紹。

private void btnXMLSerialize_Click(object sender, System.EventArgs e)
{
Product p = new Product(2, "保健食品", 590.0);

XmlSerializer serializer= new XmlSerializer(typeof (Product));

FileStream fs = new FileStream(@"c:\test.xml", FileMode.Create);

serializer.Serialize(fs, p);

fs.Close();
}

private void btnXMLDeserialize_Click(object sender, System.EventArgs e)
{
FileStream fs = new FileStream(@"c:\test.xml", FileMode.Open);

XmlSerializer xs = new XmlSerializer(typeof(Product));

Product p = (Product) xs.Deserialize(fs);

MessageBox.Show(p.name);

fs.Close();
}

沒有留言:

張貼留言