序列化是什麼?我們在程式設計中常常遇到這類問題,如何將物件儲存到永久儲存介質上(一般是硬碟),當程式下一次啟動時在從永久儲存介質上讀取該物件。一般,要整個儲存物件是不可能的,也沒有必要,因為乙個物件不僅有成員變數,也有成員方法,那我們要如何做到這一點,這就是這篇文章所講的技術——序列化!
序列化是將物件的所有特徵儲存起來,以便下次讀取該特徵時可以將該物件還原出來。
乙個物件要序列化,對應的類必須支援可序列化,支援可序列化的類必須有5個要求:(假設我們建立了cgraph類)
1.該類必須從cobject類繼承;
2.過載serialize(carchive& ar)函式;
3.在類的宣告處使用declare_serial(cgraph)宣告該類可序列化;
4.定義乙個不帶引數的建構函式;
5.在原始檔中使用implement_serial(cgraph,cobject,1)實現該類可序列化;(1代表了版本號,寫入物件和讀取物件的版本號必須一致)
下面以乙個例項講解:
1.新建單文件工程,命名為serialize;
2.在工程中新增新類cgraph,其基類為cobject,如下
class cgraph : public cobject //1.從cobject繼承
;在該類的原始檔中加入
implement_serial(cgraph,cobject,1) //5.實現該類可序列化
3.在cgraph類中的帶引數的建構函式中加入:
//originpoint,newpoint,graphtype都是要儲存和使用的成員變數
cgraph::cgraph(cpoint originpoint,cpoint newpoint,int graphtype)
在serialize()中加入:
void cgraph::serialize(carchive& ar)
}在自定義函式ondraw()中加入:
//在檢視類中以一定格式顯示資料
void cgraph::ondraw(cdc* pdc)
}4.在cserializeview類中處理直線和矩形的繪製和顯示:
void cserializeview::onlbuttondown(uint nflags, cpoint point)
void cserializeview::onlbuttonup(uint nflags, cpoint point)
cserializedoc* pdoc = getdocument();//得到文件指標,所有資料存在文件的m_obarray中
//必須在堆中建立資料,或其他長久保持資料的方法
cgraph* pgraph=new cgraph(originpoint,point,graphtype);
pdoc->m_obarray.add(pgraph);
dc.selectobject(poldbrush);
cview::onlbuttonup(nflags, point);
}void cserializeview::online()
void cserializeview::onrentangle()
在該類的ondraw()函式中加入:
void cserializeview::ondraw(cdc* pdc)
5,最後在cserializedoc類中的serialize()加入:
void cserializedoc::serialize(carchive& ar)}}
其中m_obarray是cobarray類變數,它和cptrarray很相識。
這樣,便可以完成儲存和載入物件的功能了。
序列化(序列化)
原書上翻譯為序列化,msdn翻譯為序列化 作用 當需要儲存,或者網路傳輸 remoting時,資料 物件或值 需要序列化 類似於打包傳輸檔案。system.serializableattribute 序列化是指儲存和獲取磁碟檔案 記憶體或其他地方中的物件。在序列化時,所有的例項資料都儲存到儲存介質上...
php關於序列化和反序列化的應用
我作為乙個初學者,感覺這個這個不是很懂什麼意思,最近用到了,就做乙個小總結 我用序列化其實為了方便把許多關聯的資料存在資料表裡,比如 乙個商場優惠活動,某乙個商品 乙個 30元,買兩個 是50 5個是100 正常儲存資料的時候我們乙個乙個儲存是也可以的 但是如果我們使用序列化就不用那麼複雜,將這三個...
樹的序列化與反序列化及應用
我們知道,先序和中序或者後序與中序都可以唯一確定一棵樹,但是先序和後序不行。今有兩個需求 判斷兩棵樹是否元素相等或是否元素對稱。方法1 先序和中序或者中序和後序可以唯一確定一棵樹,那麼我們把他們遍歷生成的特徵序列對比即可判斷。判相等 用遞迴函式,引數是兩棵樹的跟節點,兩個節點採取任意一種遍歷方式,以...