月份: 十一月 2006

程式開發教學–進階觀念….序列化(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);
    }
}
 
               

談論主題 我的專長之ㄧ…NET FOR C#

 

引述

我的專長之ㄧ…NET FOR C#

      今天跟微軟NAVISION ERP系統廠商開會,開了整個下午,心裡想怎麼大的系統,我一個人寫,要怎麼寫呢??時間多久呢?裡面有多少專業知識與程式技巧是我所沒有的呢?我給自己又下了一個目標,我要征服它,這樣我的程式功力一定可以到達巔峰,不過看來還需要好多年,大概努力的話要2-5年吧?太多太多要學了,但我可以的,因為我是阿倫–程式小蓋….,如果有天真的哪我努力達成,到時我一定要橫掃資訊廠商,說笑的啦,如果廠商看到我,不要打我,但搞不好真的讓我要哪麼一天,如果有哪麼一天,老媽老爸,你們可以退休了啦,我買棟大大大大別墅給你們住,讓你們環遊旅行,過過你們的小小情人,哈哈哈,哇,阿倫你好孝順。
      開完會後,理所當然,都快下班時間了,今天想早點離開,就準時離開公司,一樣去打籃球,發覺籃球框,是我的目標,隨然我不高,但我志氣高,我相信,球我一次不進,第二次不進,我再次補進,如過還是不進,我罰我發球10次,在假想有個很高的敵手,先天性條件輸他,但想到我爸爸的一句話"辣椒不是看大粒,是看辣度",所以心想以速度取勝,以技巧取勝…不能認輸,這點驗證了我的抱負,就算真實敵手出現,要告訴自己,不到最後關頭,不能輸,即時輸了,又想到我爸爸的一句話"每個人生下來,必定有他的缺陷,但也有他的過人之處",我相信如果球場輸了,職場.毅力.目標.膽識.骨氣.我樣樣不輸,今天一樣感情我要告訴自己我只是暫時的失敗,我也要告訴自己幾時失敗100次 1000次 10000次,我都沒關係,因為我是真心的,我可以大聲告訴自己,隨然失敗了,但我沒有對不起自己,我也不能怪對方,要用最誠心的祝福她,因為她得到她的快樂她的幸福,而我也贏了,因為我就是要讓她幸福….隨然我會在暗夜裡哭泣…開玩笑的啦…
     打完球後,再寫寫部落格,抒發自己的想法與心情,把自己的目標跟想法發佈,給自己一個勇氣的力量,洗完澡後,就是另外一個努力的開始,我今天要專研ASP.NET FOR C# ,如果搞不懂,我今天不睡了,祝福我吧….程式小蓋,目標一定要達成 ….

我的專長之ㄧ…NET FOR C#

      今天跟微軟NAVISION ERP系統廠商開會,開了整個下午,心裡想怎麼大的系統,我一個人寫,要怎麼寫呢??時間多久呢?裡面有多少專業知識與程式技巧是我所沒有的呢?我給自己又下了一個目標,我要征服它,這樣我的程式功力一定可以到達巔峰,不過看來還需要好多年,大概努力的話要2-5年吧?太多太多要學了,但我可以的,因為我是阿倫–程式小蓋….,如果有天真的哪我努力達成,到時我一定要橫掃資訊廠商,說笑的啦,如果廠商看到我,不要打我,但搞不好真的讓我要哪麼一天,如果有哪麼一天,老媽老爸,你們可以退休了啦,我買棟大大大大別墅給你們住,讓你們環遊旅行,過過你們的小小情人,哈哈哈,哇,阿倫你好孝順。
      開完會後,理所當然,都快下班時間了,今天想早點離開,就準時離開公司,一樣去打籃球,發覺籃球框,是我的目標,隨然我不高,但我志氣高,我相信,球我一次不進,第二次不進,我再次補進,如過還是不進,我罰我發球10次,在假想有個很高的敵手,先天性條件輸他,但想到我爸爸的一句話"辣椒不是看大粒,是看辣度",所以心想以速度取勝,以技巧取勝…不能認輸,這點驗證了我的抱負,就算真實敵手出現,要告訴自己,不到最後關頭,不能輸,即時輸了,又想到我爸爸的一句話"每個人生下來,必定有他的缺陷,但也有他的過人之處",我相信如果球場輸了,職場.毅力.目標.膽識.骨氣.我樣樣不輸,今天一樣感情我要告訴自己我只是暫時的失敗,我也要告訴自己幾時失敗100次 1000次 10000次,我都沒關係,因為我是真心的,我可以大聲告訴自己,隨然失敗了,但我沒有對不起自己,我也不能怪對方,要用最誠心的祝福她,因為她得到她的快樂她的幸福,而我也贏了,因為我就是要讓她幸福….隨然我會在暗夜裡哭泣…開玩笑的啦…
     打完球後,再寫寫部落格,抒發自己的想法與心情,把自己的目標跟想法發佈,給自己一個勇氣的力量,洗完澡後,就是另外一個努力的開始,我今天要專研ASP.NET FOR C# ,如果搞不懂,我今天不睡了,祝福我吧….程式小蓋,目標一定要達成 ….