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

旅途

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

在C++中創(chuàng)建持久對象

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

?

序列化(serialization )基礎(chǔ)

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

?

序列化內(nèi)置數(shù)據(jù)類型

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

?

#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()的第一個參數(shù)類型為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));

}

?

序列化對象

要序列化一個完整的對象,應(yīng)把每個數(shù)據(jù)成員寫入文件中:

?

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));

}

?

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

?

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));

}

?

性能 優(yōu)化

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

?

void MP3_clip::serialize()

{

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

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

}

?

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

?

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

?

小結(jié)

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

?

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>
            一区二区三区在线看| 亚洲国产精品传媒在线观看| 亚洲欧美日韩在线不卡| 中文在线一区| 狂野欧美一区| 麻豆91精品| 亚洲尤物在线视频观看| 国产美女精品免费电影| 久久成人综合网| 欧美激情在线免费观看| 久久嫩草精品久久久精品| 91久久精品国产91久久性色| 亚洲免费一级电影| 欧美伦理视频网站| 亚洲欧洲一区二区在线播放| 亚洲电影免费观看高清完整版在线 | 欧美成人免费网| 亚洲精品乱码久久久久久蜜桃91 | 亚洲第一中文字幕| 欧美日韩国产成人高清视频| 亚洲午夜免费视频| 日韩亚洲精品电影| 亚洲一区免费视频| 国产精品美女久久久久久2018| 亚洲麻豆国产自偷在线| 亚洲区中文字幕| 免费观看在线综合| 99视频超级精品| 亚洲永久在线| 亚洲视频第一页| 亚洲一区二区三区在线观看视频| 亚洲一区二区精品在线| 欧美一区二区三区成人| 91久久国产精品91久久性色| 亚洲欧美日韩中文在线制服| 亚洲第一视频网站| 免费视频一区| 亚洲欧美日韩在线一区| 欧美日韩国产精品成人| 狠狠久久亚洲欧美| 91久久精品一区二区三区| 亚洲一区二区四区| 国产午夜精品理论片a级探花 | 久久午夜影视| 亚洲日韩欧美视频一区| 久久嫩草精品久久久精品一| 中日韩美女免费视频网址在线观看 | 亚洲一级影院| 亚洲精美视频| 亚洲欧美欧美一区二区三区| 91久久综合| 久久久一区二区| 国产精品青草久久| 欧美亚洲免费| 亚洲视频在线一区观看| 欧美日韩一区视频| 一区二区三区在线观看欧美| 久久全球大尺度高清视频| 亚洲欧美不卡| 狠狠综合久久av一区二区小说| 午夜久久久久久| 欧美一级电影久久| 激情国产一区二区| 欧美国产第二页| 欧美日韩在线播放三区四区| 亚洲精品乱码久久久久久日本蜜臀| 99国产精品久久久| 亚洲夫妻自拍| 中文网丁香综合网| 国产综合视频在线观看| 日韩小视频在线观看| 国产女主播一区| 香蕉久久a毛片| 久久av在线| 最新亚洲激情| 久久亚洲春色中文字幕久久久| 亚洲国产女人aaa毛片在线| 午夜国产欧美理论在线播放| 亚洲精品综合久久中文字幕| 欧美α欧美αv大片| 久久久久久久久久久久久女国产乱| 久久人体大胆视频| 欧美成年人在线观看| 欧美一区二区三区四区在线| 99精品国产热久久91蜜凸| 先锋影音久久| 亚洲一区在线播放| 欧美精品一卡| 午夜精品成人在线| 欧美日韩中文字幕| 午夜精品在线视频| 亚洲视频在线观看三级| 欧美成人精精品一区二区频| 亚洲成人中文| 夜夜嗨av一区二区三区网站四季av | 在线观看久久av| 欧美一级二区| 亚洲欧美一区二区激情| 欧美午夜精品理论片a级大开眼界 欧美午夜精品理论片a级按摩 | 韩国一区二区三区美女美女秀| 久热精品视频| 狠狠色综合一区二区| 欧美国内亚洲| 欧美在线视频免费播放| 欧美自拍偷拍午夜视频| 国产日韩欧美一区二区三区四区| 亚洲一区二区三区中文字幕在线| 欧美11—12娇小xxxx| 欧美破处大片在线视频| 女仆av观看一区| 亚洲日本激情| 国产日韩欧美精品在线| 欧美一级网站| 亚洲成人直播| 欧美日韩一区二区在线| 一区二区冒白浆视频| 一区二区欧美日韩| 日韩一区二区精品葵司在线| 国产精品久久久久9999| 久久福利精品| 亚洲欧美日本视频在线观看| 亚洲青涩在线| 久久久久国产精品一区二区| 亚洲欧洲日本一区二区三区| 国产精品私房写真福利视频| 免费观看国产成人| 欧美伊久线香蕉线新在线| 亚洲精品日韩在线| 久久视频免费观看| 亚洲男女自偷自拍图片另类| 亚洲精品偷拍| 一本大道久久a久久精二百| 国产欧美精品va在线观看| 国产精品www994| 欧美三级乱码| 国产精品日韩一区二区| 欧美视频不卡| 欧美性猛交视频| 国产亚洲午夜| 国产女精品视频网站免费 | 在线观看不卡| 欧美视频亚洲视频| 欧美激情国产日韩| 欧美特黄视频| 国产亚洲免费的视频看| 国产视频在线观看一区二区| 极品日韩久久| 亚洲国产精品福利| 一本久久综合亚洲鲁鲁| 一区二区三区高清在线| 欧美综合二区| 欧美午夜电影网| 激情视频一区二区三区| 最新亚洲激情| 欧美一级午夜免费电影| 欧美成人精品影院| 一区二区三区免费在线观看| 99亚洲伊人久久精品影院红桃| 亚洲摸下面视频| 欧美极品一区| 韩国av一区二区三区在线观看| 亚洲精品老司机| 欧美大片免费久久精品三p | 99精品欧美一区二区三区综合在线| 欧美精品久久99久久在免费线| 亚洲日本成人网| 欧美一级视频免费在线观看| 亚洲国产美国国产综合一区二区| 亚洲精品视频在线看| 国产精品天天摸av网| 蜜臀av在线播放一区二区三区| 蜜桃av综合| 亚洲视频精品在线| 午夜精品久久久久久久久久久久久 | 18成人免费观看视频| 国内偷自视频区视频综合| 一本色道久久88亚洲综合88| 美脚丝袜一区二区三区在线观看| 亚洲综合日韩中文字幕v在线| 国产乱码精品| 久久久久久久一区二区| 欧美一区永久视频免费观看| 亚洲国产精品国自产拍av秋霞 | 99re6热只有精品免费观看| 99在线热播精品免费99热| 欧美日韩亚洲网| 亚洲女同在线| 久久精品夜色噜噜亚洲a∨ | 亚洲主播在线观看| 欧美成人高清视频| 午夜精品国产精品大乳美女| 欧美一二三区精品| 狠狠色噜噜狠狠色综合久| 久久久久高清| 欧美第一黄色网| 久久精品电影| 国产精品美女999| 亚洲日本视频| 国产日本精品| 亚洲成色www8888|