天天看點

以C++為例子,通過操作記憶體模拟實作對象的持久化存儲(一)

原創作者:嶽東衛轉載請寫明

半夜突然興起,于是乎有敲起了代碼(哎!明早上又要曠課了 。。。):

我們用到過很多的對象序列化的,我在儲存資料 傳輸資料的時候經常用到..用的多了 就想考慮下 像MFC  以及 java  和 boost庫中他們到底是如何來實作序列化的  。

最近我在thiking in java的時候,遇到了Scanner類的具體使用.這個類可以從一個實作了Readable接口的類的對象中讀取 資料,剛好我最近給我同學做的一個小的資訊管理系統用到了對象的序列化 ,于是我就想自己覆寫這個類來實作可以從一個檔案存儲N個對象,以及從一個檔案加載N個對象 ,  于是興奮的動手開始做了。折騰了半天隻能實作一個對象的讀取,郁悶,看了Scanner這個類的源代碼發現 Sun就是用來處理文本資料的 ,複用這個類來讀取多個對象似乎不大可能 。。。沒有複用的必要。。。于是我想自己寫一個可以實作對象的存儲到本地機器以及從檔案加載對象而不用任何的庫來輔助

、  下面開始 :

    我的思路是記憶體,因為我們知道我們所有的資料都是存儲在記憶體中的二進制資料 。 那麼可以知道 我們的程式中的類的對象在運作過程中也相應的在他進城的存儲

空間中對應一段二進制資料,那麼我們是否可以将這個資料儲存到本地然後從本地加載,我就興奮的去嘗試了,下 果然可以....原來對象序列化的原理是如此簡單:

說道這裡下面代碼隻完成了 簡單的包含基本資料類型和方法的類進行序列化 ...經驗證可以實作簡單序列化 。。。

緊接着問題由來了,的确上面的代碼可以實作簡單對象的序列化但是,,當類的成員是另一個類的執行個體的時候,那麼又應該怎麼弄呢? 再運作下面代碼發現 ,程式在序列化到檔案的時候崩潰了...什麼原因呢 。。這根我們在java中和MFC對于成員對象序列化一樣,在java中如果成員對象沒有實作Serializable接口那麼那麼就會抛出一個異常 ,

在MFC中如果不成員對象所在的類如果不從CObject派生以及 增加一些宏定義那麼也會程式崩潰。。看下面代碼在上面代碼修改後就出現了問題。程式就會崩潰。。。 

對于類内部的成員對象如何進行進一步的一層一層的序列化呢?這個問題麻煩了..... 下次在繼續 睡覺 。。。