日期: 2006 年 11 月 19 日

程式開發教學–進階觀念….序列化(Serialization)

                 各位親愛的夥伴們,很多人在學習程式中,只著重於程式的基本語法,甚至很多人,認為他會宣告變數,跑跑條件式判斷程序,就認為他是會撰寫程式的一份子,這個觀念是很嚴重的落差,真正的程式開發,是應該著重於概念和商業的運作流程….常常很多人問我或告訴我他寫了多少專案,多少網頁,例如 PHP ASP VB…等,這時我就會問他,您是否有聽過執行緒.或序列化,他們都回答我說有…,哪我又會接著問他們,你曾經撰寫過相關的程式嗎?他們都不敢回答,因為我知道事實上很多人,再寫程式事實上都是在資料庫的讀取,當然很多前端或後端的基本讀取,這是很重要的一環,但是我又很喜歡問這些程式人員,你的後端是何種資料庫,你如何設計關聯性,如何正規化,有寫過STORE PROCEDURE嗎?相信又有很多人沒有回答我….因此讓我產生我想寫技術文章的動力….在程式方面,我會竟然表達各種語意概念以及基本的撰寫語法,來帶領各位….當然小弟我,也是需要不斷的學習,也有很多觀念和技術,尚缺乏…
因此如何任何問題時,也可以大家互相研究與討論…MSN:sy_tec@hotmail.com (程式小蓋)
 
                 序列化,英文為 Serialization,它的概念是這樣,當一個物件被儲存時或是跨越網路傳送之前時,均必須分解成為特別的格式,而這整個分解的過程
與動作,我們將它稱之為序列化,典型的程式用法有:物件封包的傳送.遠端服務.網路資料流都是運用了序列化的程式技術。而後續的部落格裡面我會慢慢表達與說明,並且來討論如何運用序列化發完成物件的分解與重組,在此我將使用.NET FOR C#語法來撰寫例子,當然如果有人是使用別種語法的話,將可以當作一種參考如VB.NET DELPHI等等..如果無法用您所熟析的語法來體會時,可以對照我部落格的介紹,在我專攻的程式語法,都可以互相討論…..
              
                .NET Framework將序列化分為兩種格式,第一種為所謂的二進位序列化( Binany serialization),第二種也是我目前非常注重的技術,就是所謂的XML序列化(XML serialization)。而我就開始來解釋這兩種序列化的差異性,第一種二進位序列化,它會將物件分解成電腦的二進位格式,當然這樣一來此序列化的過程他並不會遺失原來的型別資料,而且序列化後的資料將可以運用在資料流.磁片.記憶體.還有網路的連線主機..等;再來第二種XML序列化,看它的語意,我可以這樣的解釋"它是將物件分解成XML格式",而它是使用SOAP來作為一個中間的媒介的標準存取,在此小蓋也特別提示一點大家都知道XML與SOAP是一種開放的標準,所以他特別適合用來撰寫於物件需要跨越網路傳送的情形。
      
.NET FOR C#       –小蓋再此特別撰寫一支控制台序列化範例
<程式碼>
EX:
 
using System;
using System.IO;
using System.Runtime.Serialization;                           //序列化的命名空間
using System.Runtime.Serialization.Formatters.Binary ; //第一種的二進位序列化
using System.Runtime.Serialization.Formatters.Soap;    //第二種的XML序列化
public class Serializable
{
    [Serializable]                                                              //將可進行分解
  private class ClsSerializable
    {
        public int intNumber = 123456;                                   //公用
        public string strDemo = "This is a Serialization string";  //公用

        [NonSerialized]                                                       //將不可進行分解
        public long lngNumber = 654321;
        //public long lngNumber = 123456;
    }
    public static void Main()
    {
        Serializable mySerializable = new Serializable();
        ClsSerializable myClsSerializable = new ClsSerializable();

        mySerializable.SerializeBinary(myClsSerializable);
        mySerializable.SerializeSoap(myClsSerializable);
        mySerializable.PrintObject();
        Console.Read();
    }
    private void SerializeBinary(ClsSerializable o)
    {
        FileStream myFileStream = new FileStream(@"c:\sbinary.txt", FileMode.Create);
        BinaryFormatter myBFormatter = new BinaryFormatter();
        Console.WriteLine("開始進行二進位格式序列化…….");
        myBFormatter.Serialize(myFileStream, o);
        Console.WriteLine("序列化完成,資料儲存於文字文件 sbinary.txt …….");
        myFileStream.Close();
    }
    private void SerializeSoap(ClsSerializable o)
    {
        FileStream myFileStream = new FileStream(@"c:\ssoap.txt", FileMode.Create);
        SoapFormatter myBFormatter = new SoapFormatter();
        Console.WriteLine("開始進行 SOAP 格式序列化…….");
        myBFormatter.Serialize(myFileStream, o);
        Console.WriteLine("序列化完成,資料儲存於文字文件 ssoap.txt …….");
        myFileStream.Close();
    }
    private ClsSerializable DeSerialize()         //進行還原成員函式
    {
        ClsSerializable o;
        FileStream myFileStream = new FileStream(@"c:\sbinary.txt", FileMode.Open);
        BinaryFormatter myBFormatter = new BinaryFormatter();
        Console.WriteLine("開始還原序列化物件…….");
        o = (ClsSerializable)myBFormatter.Deserialize(myFileStream);
        Console.WriteLine("物件完成還原…….");
        myFileStream.Close();
        return o;
    }
    private void PrintObject()
    {
        Serializable mySerializable = new Serializable();
                   
        ClsSerializable myNewClsSerializable = mySerializable.DeSerialize();
     
        Console.WriteLine("屬性值 intNumber : {0} ", myNewClsSerializable.intNumber);
        Console.WriteLine("屬性值 strDemo : {0} ", myNewClsSerializable.strDemo);
        Console.WriteLine("屬性值 lngNumber : {0} ", myNewClsSerializable.lngNumber);
    }
}