序列化物件(.NET中) (轉)

gugu99發表於2008-05-26
序列化物件(.NET中) (轉)[@more@]

序列化(中)

其實是個很老的話題,有的時候都覺得這不算個問題.不過好久沒發表東西了

隨便寫點.不過說實話,現在很多中的例子是beta版裡的,我提供的是正式

版的.因此我想還是有一定價值的.

首先什麼是序列化呢?簡單的說就是把物件例項到中的方法.因此序列

化過程就是儲存物件的狀態.那就是說把成員資料寫如磁碟同時保持原有結構.

那麼針對序列化過程,同樣也存在反序列化.我想大家已經猜到了,就是吧已經

序列化的物件在讀出來.思想很簡單,是吧,那麼我再來舉一個小的例子,力圖吧

一個完整的序列化過程描述清楚.由於本人對了解的更加習慣.所以例子我也是

使用C#寫的,但是本質上.NET使用的是同一套 也是同一套CTS並且都

依照同樣的編碼約定,因此是一致的,

那麼現在編碼開始階段我先來介紹兩個名稱空間給大家,因為要在編碼過程中用到.

System.Runtime.Serialization
System.Runtime.Serialization.Formatters.Binary

關於這兩個名稱空間請大家參考MSDN:
ms-help://MS.VSCC/MS.MSDNVS.2052/cpref/html/frlrfSystemRuntimeSerialization.htm


ms-help://MS.VSCC/MS.MSDNVS.2052/cpref/html/frlrfSystemRuntimeSerializationFormattersBinary.htm

例子如下:

using System;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
public class SerialTest
{

 public void SerializeNow()
 {
 YarshrayToSerialize Y=new YarshrayToSerialize();
 
 Stream s=File.Open("temp.dat",FileMode.Create);
 BinaryFormatter b=new BinaryFormatter();
 b.Serialize(s,Y);
 s.Close();
 }

 public void DeSerializeNow()
 {
 YarshrayToSerialize Y=new YarshrayToSerialize();
 
 Stream s=File.Open("temp.dat",FileMode.Open);
 BinaryFormatter b=new BinaryFormatter();
 Y=(YarshrayToSerialize)b.Deserialize(s);
 Console.WriteLine("Name is:  "+Y.name);
 Console.WriteLine("Age is:  "+Y.age);
 Console.ReadLine();
 s.Close();
 }

 public static void Main(string[] s)
 {

 SerialTest st=new SerialTest();
 st.SerializeNow();
 st.DeSerializeNow();

 }

}
[Serializable()]
public class YarshrayToSerialize
{
 public int age=21;
 public string name="yarshray";

}


最後輸出結果:

Name is:  yarshray
Age is:  21


那麼我們來看這個例子.我們重點要看那裡?細心的朋友可能已經看到[Serializable()]

這個特性了.我們知道,特性在.NET中是用來描述物件或方法,要具備那些功能的.[Serializable()]

這個特性就表明了該物件具備序列化功能.(詳細參考:MSDN

ms-help://MS.VSCC/MS.MSDNVS.2052/cpref/html/frlrfSystemSerializableAttributeMembersTopic.htm)

那麼下面我再來說一下序列化的步驟.我首先定義了一個類叫做YarshrayToSerialize一看就知道

把我自己的資訊序列化.我在這個類上面加入了特性[Serializable()],要告訴RUNTIME我這個類

是要在執行時進行序列化的.這裡我要提一點,如果你不要[Serializable()]這個特性那麼編譯是

可以透過的.可是執行時就會丟擲一個異常.這就說明序列化是在執行其間的操作.其實你從

名稱空間也可以看的出來.然後我在我的SerialTest類中,讀寫磁碟.把資訊儲存到一個叫做temp.dat

的中,當然這個檔案是我自定義的,你也可以定義其它的.這裡用到了流物件和檔案物件的操作.

這是IO操作.不在本文範圍內,如果你還不清楚,可以參考.Net的IO操作.在主中我直接了

兩個方法.一個是序列化,一個是反序列化.這裡重點程式碼就是BinaryFormatter.Serialize(s,Y)

和  BinaryFormatter.Deserialize(s)這個方法返回的是一個因此我在這裡進行了一次

拆箱操作(對於拆箱請不要和強制型別轉化及這個物件虛指標放在一個概念.當然這也不在本文

討論範圍內).

那麼接下來,我要說一下序列化物件的基本步驟,因為我上面的只是一個簡單的例子,如果複雜的

操作它的基本步驟是不會變的.這裡我覺得應該分為四個步驟來進行:

1.首先我要建立物件例項(也就是這一句YarshrayToSerialize Y=new YarshrayToSerialize();

把類例項化為物件)其目的就是為了吧這個物件的狀態儲存到磁碟中

2.需要建立一個流物件來讀寫檔案物件

3.需要建立一個具有序列化功能的物件(這裡我用到的是BinaryFormatter當然如果你序列化

就需要Formatter)

4.那很顯然,就是把物件例項透過serialize方法進行序列化儲存.

反序列化和這個類似,只是把serialize方法變為這個Deserialize方法.那麼步驟是相同的.

你可以結合上面的程式碼來看看.那麼關於序列化的話題我就講到這裡,那麼複雜的類操作基本

步驟是一樣.你只要加入屬性和方法等就可以了.

最後談點題外話,序列化技術已經被多種FrameWork封裝,並提供相應的功能呼叫.這作為物件

的永久儲存的作用是非常明顯的.當然你在反序列化過程中必須要支援動態建立否則就沒意義

了嘛.


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-1004602/,如需轉載,請註明出處,否則將追究法律責任。

相關文章