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

旅途

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

在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>
            麻豆精品精品国产自在97香蕉| 国产精品资源| 国产精品国产馆在线真实露脸| 亚洲第一网站| 欧美高清不卡在线| 中文日韩在线视频| 国产一级揄自揄精品视频| 久久精品日韩一区二区三区| 亚洲另类自拍| 亚洲影视九九影院在线观看| 亚洲午夜小视频| 国产亚洲精品aa午夜观看| 国产欧美日韩一区| 亚洲一区制服诱惑| 亚洲精品一区二区三区四区高清 | 亚洲欧洲一区二区三区久久| 免费观看一级特黄欧美大片| 亚洲国产经典视频| 亚洲视屏在线播放| 久久影院午夜论| 欧美深夜福利| 在线观看视频免费一区二区三区| 日韩一区二区高清| 久久精品国产精品| 亚洲激情国产精品| 欧美亚洲专区| 欧美日韩影院| 亚洲丁香婷深爱综合| 亚洲欧美bt| 亚洲黄色成人网| 久久激情综合| 国产精品久线观看视频| 亚洲激情电影中文字幕| 久久国产精品久久w女人spa| 亚洲人成网站在线观看播放| 欧美一区午夜精品| 欧美色欧美亚洲另类二区| 亚洲国产精品电影在线观看| 欧美在线亚洲综合一区| av不卡在线| 欧美精品在线网站| 亚洲精品1区2区| 免费91麻豆精品国产自产在线观看| 亚洲一区二区三区免费观看| 欧美日韩91| 亚洲精选国产| 亚洲高清av在线| 狼人社综合社区| 亚洲电影有码| 蘑菇福利视频一区播放| 久久gogo国模啪啪人体图| 国产精品网曝门| 亚洲午夜精品久久久久久app| 欧美国产日韩一区二区三区| 久久精品国产一区二区三区| 国产一区二区| 久久人人爽爽爽人久久久| 午夜精品久久久久久久99樱桃| 国产精品萝li| 欧美与黑人午夜性猛交久久久| 亚洲一区在线观看视频 | 在线视频国产日韩| 欧美91大片| 蜜桃久久av一区| 亚洲美女视频网| 亚洲精品字幕| 国产精品高清一区二区三区| 亚洲欧美日韩国产一区二区三区 | 免费一级欧美在线大片| 久久婷婷久久| 久久久久亚洲综合| 亚洲人体1000| 99re在线精品| 国产精品美女主播| 久久精品国产第一区二区三区| 久久精品色图| 亚洲精品国产精品久久清纯直播| 91久久国产自产拍夜夜嗨| 欧美日韩综合在线| 午夜亚洲性色福利视频| 欧美在线91| 亚洲国产精品久久久久| 亚洲精品一区二区网址| 国产精品日韩欧美大师| 免费成人av| 欧美视频久久| 久久夜色精品国产| 欧美精品一区二区三区在线看午夜| 亚洲男女自偷自拍图片另类| 久久黄金**| 一区二区三区精品在线| 欧美一区二区三区在线观看| 亚洲三级国产| 亚久久调教视频| 一二三区精品福利视频| 欧美专区日韩专区| 亚洲视频一区二区在线观看| 久久久久9999亚洲精品| 亚洲午夜精品一区二区| 久久亚洲一区二区| 午夜影院日韩| 欧美日韩国产一区二区三区地区| 欧美一区二区免费观在线| 欧美成人精品激情在线观看| 久久成人精品无人区| 欧美日韩亚洲一区二区三区| 久久视频这里只有精品| 国产精品高清在线| 亚洲国产美国国产综合一区二区| 国产精品免费一区二区三区在线观看 | 国产午夜精品久久久久久久| 最新亚洲激情| 影视先锋久久| 午夜精品影院在线观看| 亚洲一区二区三区高清不卡| 玖玖精品视频| 久久久久久穴| 国产女人精品视频| 一区二区成人精品| 99热在线精品观看| 欧美fxxxxxx另类| 免费试看一区| 狠狠色丁香久久婷婷综合_中| 一区二区三区欧美视频| 在线亚洲一区| 欧美日韩国产色视频| 亚洲毛片在线观看| 久久av一区二区| 国产精品久久久久久久久免费樱桃| 亚洲国产mv| 亚洲国产精品国自产拍av秋霞| 久久激情五月丁香伊人| 欧美专区在线| 国产日产欧美一区| 午夜精品剧场| 久久精品成人一区二区三区蜜臀| 国产精品久久久久久影院8一贰佰| 99精品视频免费| 亚洲在线视频网站| 国产精品久久久久9999吃药| 一卡二卡3卡四卡高清精品视频 | 猫咪成人在线观看| 在线观看精品| 母乳一区在线观看| 亚洲高清在线精品| 一本大道久久a久久精品综合| 欧美激情1区2区| 亚洲乱码视频| 午夜精品一区二区三区在线| 国产欧美日本| 久久久久一区| 亚洲国产高清自拍| 一区二区三区色| 国产精品毛片在线| 欧美一区二区三区四区视频| 美女日韩欧美| 99国产精品99久久久久久| 欧美视频不卡中文| 午夜国产精品影院在线观看| 老牛嫩草一区二区三区日本| 91久久国产综合久久蜜月精品 | 国产日韩在线看片| 久久亚洲一区二区三区四区| 亚洲激情第一区| 亚洲一区尤物| 一区免费视频| 欧美日本一区二区高清播放视频| 在线亚洲精品| 久久只精品国产| 亚洲视频一区二区免费在线观看| 国产偷自视频区视频一区二区| 欧美成人小视频| 午夜视频一区| 亚洲精品偷拍| 久久这里只有精品视频首页| 亚洲视屏在线播放| 一区二区三区在线免费视频| 欧美日韩精品免费观看视一区二区 | 亚洲高清不卡av| 欧美日韩午夜| 久久久www成人免费无遮挡大片 | 美腿丝袜亚洲色图| 国产在线观看一区| 亚洲精品国久久99热| 性xx色xx综合久久久xx| 亚洲国产影院| 国产一区二区三区免费观看| 欧美日韩亚洲高清一区二区| 久久久亚洲午夜电影| 亚洲婷婷综合久久一本伊一区| 欧美大胆成人| 久久亚洲精品视频| 欧美一级专区免费大片| 日韩亚洲精品在线| 亚洲大片在线| 国产综合婷婷| 国产精一区二区三区| 欧美色图天堂网| 欧美精品九九| 久久一区免费|