青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

旅途

如果想飛得高,就該把地平線忘掉

在C++中創建持久對象

持久對象(persistent objects)廣泛應用于游戲、分布式數據庫系統、多媒體以及圖形應用程序中。目前C++并不直接支持持久性(persistence)(但有一些在C++未來版本中添加持久性和反射(reflection)的建議)。持久對象可以在創建它的程序的作用域之外保持自身狀態。把對象寫入一個文件并在以后重建之,或者把對象傳送到一臺遠程機器,就是這樣的例子。對持久性的支持并不象第一眼看上去那樣簡單,同一對象的大小和內存布局在不同的平臺上可能并不相同,而不同的字節次序(byte ordering),或稱為endian-ness,使事情更加復雜化。在下文中我將討論如何實現持久性,而無須求助于DCOM和 Corba之類的第三方框架。對于小型和可移植的應用程序而言,這是一種有效并令人滿意的方案。

?

序列化(serialization )基礎

為了使一個對象持久存在,必須把它的狀態保存在非易失的存儲設備中。考慮一個錄制和播放mp3文件的應用程序,每首單曲都表示為一個包含標題、唱片、歌手、時間、速率、錄制日期以及相應的 MP3文件的對象,該應用程序在跟蹤列表中顯示最近播放的曲目。你的目標是通過序列化,也就是把對象寫入一個文件,使MP3對象成為持久對象,同時通過反序列化(deserialization)在下一個 session中重建這些對象。

?

序列化內置數據類型

每個對象最終都由內置數據成員組成,如int, bool, char[]等等。你的第一個任務是把這樣的類型寫入一個輸出文件流(ofstream)中。應用程序必須這些值存儲為相應的二進制形式,基于這個目的,應使用write() 和read() 成員函數。write() 以某個變量的地址和大小為參數,把該變量的位模式寫入一個文件流中。read() 的兩個參數為char*和long類型,分別指示內存緩沖區的地址和字節大小。下面的例子演示如何在ofstream中保存兩個整數:

?

#include <fstream>

using namespace std;

int main()

{

?int x,y; // mouse coordinates

?// ..assign values to x and y

?ofstream archive("coord.dat", ios::binary);

?archive.write(reinterpret_cast<char *>(&x), sizeof (x));

?archive.write(reinterpret_cast<char *>(&x), sizeof (x));

?archive.close();

}

?

使用reinterpret_cast<>是必要的,因為write()的第一個參數類型為const char*,但&x和&y是int*類型。

?

以下代碼讀取剛才存儲的值:

?

#include <fstream>

using namespace std;

int main()

{

?int x,y;

?ifstream archive("coord.dat");

?archive.read((reinterpret_cast<char *>(&x), sizeof(x));

?archive.read((reinterpret_cast<char *>(&y), sizeof(y));

}

?

序列化對象

要序列化一個完整的對象,應把每個數據成員寫入文件中:

?

class MP3_clip

{

private:

?std::time_t date;

?std::string name;

?int bitrate;

?bool stereo;

public:

?void serialize();

?void deserialize();

?//..

};

?

void MP3_clip::serialize()

{

{

?int size=name.size();// store name's length

?//empty file if it already exists before writing new data

?ofstream arc("mp3.dat", ios::binary|ios::trunc);

?arc.write(reinterpret_cast<char *>(&date),sizeof(date));

?arc.write(reinterpret_cast<char *>(&size),sizeof(size));

?arc.write(name.c_str(), size+1); // write final '\0' too

?arc.write(reinterpret_cast<char *>(&bitrate),

?sizeof(bitrate));

?arc.write(reinterpret_cast<char *>(&stereo),

?sizeof(stereo));

}

?

實現deserialize() 需要一些技巧,因為你需要為字符串分配一個臨時緩沖區。做法如下:

?

void MP3_clip::deserialize()

{

?ifstream arce("mp3.dat");

?int len=0;

?char *p=0;

?arc.read(reinterpret_cast<char *>(&date), sizeof(date));

?arc.read(reinterpret_cast<char *>(&len), sizeof(len));

?p=new char [len+1]; // allocate temp buffer for name

?arc.read(p, len+1); // copy name to temp, including '\0'

?name=p; // copy temp to data member

?delete[] p;

?arc.read(reinterpret_cast<char *>(&bitrate),

?sizeof(bitrate));

?arc.read(reinterpret_cast<char *>(&stereo),

?sizeof(stereo));

}

?

性能 優化

你可能會感到迷惑,為什么不把整個對象一次性轉儲到文件中,而必須對每個數據成員進行序列化呢?換句話說,難道不能用下面的方式實現serialize() 嗎?

?

void MP3_clip::serialize()

{

?ofstream arc("mp3.dat", ios::binary|ios::trunc);

?arc.write(reinterpret_cast<char *>(this),sizeof(*this));

}

?

不行,不能這樣做。這種方式至少存在兩個問題。通常,當被序列化的對象還包含其它一些對象時,你不能簡單地把該對象轉儲到一個文件中并指望以后從中重建一個有效的對象。在我們的例子中,外層對象包含一個std::string成員,一個淺拷貝(tips/tipview.

?

另一個問題設計到多態對象。每個多態對象都含有一個vtpr,即一個指向虛擬函數地址分配表的隱藏指針。vtpr的值是時變的,如果你把整個多態對象轉儲到一個文件中,然后強行把歸檔后的數據添加到一個新的對象上,則其vptr可能無效并導致未定義的行為。再次提醒,解決方案是只對非時變的數據成員進行序列化和反序列化。另一種方法是計算vptr的確切偏移量,在從文件重建對象時不要動它。記住,vptr的位置是與實現相關的,因此這樣的代碼是不可移植的。

?

小結

雖然C++不直接支持對象持久性,但手工實現它并不難,只要你遵從一些基本的準則:首先把每個復合對象分解為原始數據類型,然后對這些原始數據類型進行序列化。當序列化數據時,記住要跳過時變的值。在反序列化過程中,讀取剛才存儲的值。處理string對象、數組和句柄需要一些技巧:總是要對它們解引用,存儲它們所指向的值。記住在一個單獨的字段中存儲string或數組的大小。

?

posted on 2007-07-31 13:01 旅途 閱讀(142) 評論(0)  編輯 收藏 引用 所屬分類: C/C++

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            另类天堂视频在线观看| 国产一区日韩一区| 欧美激情女人20p| 久久亚洲视频| 蜜臀99久久精品久久久久久软件| 亚洲欧美在线看| 亚洲欧美日韩第一区| 亚洲在线观看| 午夜一级久久| 久久一区二区三区国产精品 | 亚洲神马久久| 亚洲一区视频在线观看视频| 午夜精品在线| 久久久99免费视频| 你懂的视频欧美| 欧美日韩国产小视频| 国产精品爽黄69| 狠狠狠色丁香婷婷综合久久五月| 亚洲高清色综合| 亚洲视频大全| 欧美一区二区日韩一区二区| 久久综合九色综合久99| 亚洲人成在线影院| 一区二区免费看| 久久成人精品电影| 欧美极品在线播放| 国产网站欧美日韩免费精品在线观看| 精品盗摄一区二区三区| 一本色道久久综合一区| 久久精品99久久香蕉国产色戒| 欧美高清不卡| 亚洲欧美久久久久一区二区三区| 久久亚洲二区| 国产精品手机在线| 一区二区三区国产精品| 美国成人直播| 亚洲欧美日韩另类精品一区二区三区 | 悠悠资源网久久精品| 在线视频一区二区| 免费久久99精品国产自在现线| 99re视频这里只有精品| 久久久久久精| 国产精品自拍三区| 一区二区三区视频在线看| 久久亚洲春色中文字幕久久久| 亚洲视频二区| 欧美在线观看网站| 最新成人av网站| 久久精品99国产精品酒店日本| 亚洲国产精品成人| 欧美一区二区福利在线| 国产精品久久777777毛茸茸| 91久久精品国产91久久性色| 久久不射中文字幕| 中文日韩在线视频| 欧美少妇一区二区| 夜夜嗨av一区二区三区中文字幕| 免费看的黄色欧美网站| 久久九九免费视频| 国产原创一区二区| 久久不见久久见免费视频1| 亚洲午夜精品| 欧美亚州一区二区三区| 亚洲视频在线一区| 一区二区三区欧美| 国产精品日韩一区二区| 亚洲欧美日本日韩| 午夜精品一区二区三区电影天堂| 国产精品日韩专区| 久久www成人_看片免费不卡| 欧美一区二区视频免费观看| 国产欧美日韩另类一区| 久久超碰97人人做人人爱| 亚洲视频一区二区| 国产麻豆一精品一av一免费| 欧美一区二区国产| 欧美与欧洲交xxxx免费观看| 国产在线不卡精品| 美女网站久久| 欧美国产日韩一区二区| 日韩亚洲成人av在线| 日韩视频一区| 国产精品久久久久秋霞鲁丝| 久久精品国内一区二区三区| 久久久精彩视频| 亚洲国产岛国毛片在线| 亚洲电影成人| 欧美色123| 久久精品女人天堂| 麻豆精品一区二区av白丝在线| 99精品国产一区二区青青牛奶| 一本色道久久综合精品竹菊| 国产一区二区三区电影在线观看| 免费成人av在线| 欧美日韩国产一级片| 欧美一区二区视频在线| 久久婷婷国产综合尤物精品 | 一区二区三区免费在线观看| 一区二区三区黄色| 激情综合亚洲| 日韩午夜高潮| 激情久久五月天| 日韩一级黄色大片| 黄色成人小视频| 日韩一二在线观看| 狠狠干狠狠久久| 亚洲午夜羞羞片| 欧美精品一区二区在线播放| 国产欧美一区二区三区另类精品 | 久久亚洲私人国产精品va媚药| 久久青草欧美一区二区三区| 一区二区三区三区在线| 欧美自拍偷拍| 亚洲自拍偷拍麻豆| 你懂的国产精品永久在线| 欧美一区综合| 欧美日韩亚洲高清一区二区| 老鸭窝91久久精品色噜噜导演| 欧美日韩在线视频一区| 亚洲第一区在线| 国内久久婷婷综合| 亚洲色图综合久久| 一区二区日韩精品| 女人天堂亚洲aⅴ在线观看| 久久久噜噜噜久久人人看| 国产精品va| 日韩一级不卡| 一区二区三区免费看| 欧美电影打屁股sp| 欧美凹凸一区二区三区视频| 久久精品国产久精国产爱| 蜜桃av一区二区三区| 欧美一区二区免费视频| 欧美特黄视频| 日韩亚洲视频| 一区二区三区免费观看| 欧美精品日韩综合在线| 欧美激情麻豆| 日韩一区二区高清| 欧美成人免费在线视频| 免费永久网站黄欧美| 在线播放不卡| 美女精品在线| 亚洲大片一区二区三区| 亚洲激情六月丁香| 欧美成人精精品一区二区频| 老司机一区二区| 亚洲国产精品久久人人爱蜜臀| 久久五月婷婷丁香社区| 欧美电影免费观看| 亚洲美女性视频| 欧美午夜激情小视频| 亚洲深夜福利在线| 久久久成人精品| 在线成人激情视频| 免费高清在线一区| 亚洲免费av网站| 午夜精品久久久久久久99水蜜桃| 国产精品资源| 麻豆国产精品va在线观看不卡| 亚洲国产日韩欧美一区二区三区| 99国产精品久久久久久久成人热| 欧美日韩三区| 亚洲欧美日韩成人高清在线一区| 久久青草欧美一区二区三区| 亚洲黄色免费电影| 欧美午夜不卡在线观看免费| 亚洲欧美日本伦理| 欧美国产在线视频| 男女av一区三区二区色多| 久久亚洲不卡| 韩国av一区二区三区| 久久亚洲综合| 欧美一区二区日韩一区二区| 欧美国产一区二区| 亚洲激情图片小说视频| 欧美男人的天堂| 亚洲影院色无极综合| 久久精品亚洲一区| 亚洲国产精品va| 欧美性猛交xxxx乱大交退制版| 亚洲欧美久久| 欧美国产日韩视频| 午夜精品久久久久久久久久久久 | 韩日精品视频| 欧美大片免费看| 午夜精品久久久久久久99樱桃| 鲁大师影院一区二区三区| 一区二区三区四区五区精品视频 | 影院欧美亚洲| 欧美久久成人| 久久精品人人做人人爽电影蜜月 | 久久久在线视频| 在线午夜精品| 亚洲第一级黄色片| 久久精品人人做人人爽| 亚洲网站在线播放| 亚洲国产精品激情在线观看| 国产日本精品| 国产精品v欧美精品v日本精品动漫|