亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

C++學習:在C++中創建持久對象

2019-11-17 05:04:14
字體:
來源:轉載
供稿:網友
   持久對象(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 更多文章 更多內容請看C/C++技術專題專題,或     // ..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;   vint 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: 更多文章 更多內容請看C/C++技術專題專題,或     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::binaryios::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));   } 更多文章 更多內容請看C/C++技術專題專題,或    實現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()   { 更多文章 更多內容請看C/C++技術專題專題,或     ofstream arc("mp3.dat", ios::binaryios::trunc);    arc.write(reinterpret_cast<char *>(this),sizeof(*this));   }
   不行,不能這樣做。這種方式至少存在兩個問題。通常,當被序列化的對象還包含其它一些對象時,你不能簡單地把該對象轉儲到一個文件中并指望以后從中重建一個有效的對象。在我們的例子中,外層對象包含一個std::string成員,一個淺拷貝(shallow copy)操作會把std::string成員歸檔,但其值是時變的,意思是說每次運行程序時都可能改變。更糟的是,由于std::string事實上并不包含一個字符數組,而是一個指針,使用淺拷貝試圖重建原始字符串是不可能的。為克服這個問題,程序沒有序列化string對象,而是歸檔其含有的字符和長度。一般來說,指針,數組和句柄應以相同的方式進行處理。   另一個問題設計到多態對象。每個多態對象都含有一個vtpr,即一個指向虛擬函數地址分配表的隱藏指針。vtpr的值是時變的,假如你把整個多態對象轉儲到一個文件中,然后強行把歸檔后的數據添加到一個新的對象上,則其vptr可能無效并導致未定義的行為。再次提醒,解決方案是只對非時變的數據成員進行序列化和反序列化。另一種方法是計算vptr的確切偏移量,在從文件重建對象時不要動它。記住,vptr的位置是與實現相關的,因此這樣的代碼是不可移植的。   小結   雖然C++不直接支持對象持久性,但手工實現它并不難,只要你遵從一些基本的準則:首先把每個復合對象分解為原始數據類型,然后對這些原始數據類型進行序列化。當序列化數據時,記住要跳過時變的值。在反序列化過程中,讀取剛才存儲的值。處理string對象、數組和句柄需要一些技巧:總是要對它們解引用,存儲它們所指向的值。記住在一個單獨的字段中存儲string或數組的大小。

更多文章 更多內容請看C/C++技術專題專題,或

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲成人网av| 久久伊人精品一区二区三区| 成人激情在线播放| 91精品国产成人www| 88国产精品欧美一区二区三区| 精品久久久久久亚洲精品| 国产脚交av在线一区二区| 欧美性xxxx极品高清hd直播| 国产精品入口福利| 久久99国产精品久久久久久久久| 亚洲专区在线视频| 国产999视频| 欧美激情啊啊啊| 久久久国产精品免费| 色妞一区二区三区| 亚洲精品www久久久久久广东| 91九色综合久久| 欧美放荡办公室videos4k| 成人久久久久爱| 国产精品爱久久久久久久| 美女视频黄免费的亚洲男人天堂| 欧美日韩在线视频首页| 亚洲福利精品在线| 亚洲天堂久久av| 亚洲一区av在线播放| 国产精品久久久999| 日本高清视频一区| 日韩成人小视频| 欧洲美女免费图片一区| 国产精品夜色7777狼人| 亚洲伊人久久大香线蕉av| 久久久久久久久久婷婷| 久久久噜久噜久久综合| 亚洲国产精品视频在线观看| 亚洲激情久久久| 久久亚洲精品成人| 美日韩在线视频| 亚洲a一级视频| 亚洲精选一区二区| 日韩高清不卡av| 成人做爰www免费看视频网站| 欧美日韩国产精品| 国产在线播放91| 精品一区二区三区三区| 欧美放荡办公室videos4k| 亚洲深夜福利视频| 国产日韩av高清| 久久久久久久久国产精品| 精品一区二区三区四区| 日韩国产在线看| 欧洲亚洲免费视频| 日韩精品999| 2019亚洲男人天堂| 中文字幕亚洲综合久久筱田步美| 欧美午夜激情小视频| 97人洗澡人人免费公开视频碰碰碰| 亚洲黄色av女优在线观看| 亚洲免费视频网站| 九九热精品在线| 久久亚洲精品国产亚洲老地址| 国产欧美精品一区二区三区介绍| 18久久久久久| 欧美大片va欧美在线播放| 亚洲人在线观看| 国产成人精品在线播放| 国产91九色视频| 国产剧情日韩欧美| 精品成人国产在线观看男人呻吟| 不用播放器成人网| 欧美性色19p| 国产成人综合亚洲| 国产成人在线亚洲欧美| 欧美中在线观看| 国产精品国产亚洲伊人久久| 国产suv精品一区二区三区88区| 久久精品免费播放| 久久综合九色九九| 中文字幕久久精品| 精品久久久香蕉免费精品视频| 国产精品亚洲自拍| 狠狠久久五月精品中文字幕| 欧美日韩国产在线看| 亚洲国产精品悠悠久久琪琪| 欧美在线影院在线视频| 欧美激情综合色| 国产成人中文字幕| 在线视频欧美日韩精品| 国产亚洲精品一区二555| 视频直播国产精品| 在线观看视频99| 狠狠躁天天躁日日躁欧美| 91九色单男在线观看| 欧美日韩在线免费观看| 欧美国产极速在线| 亚洲精品在线观看www| 国产一区二区三区直播精品电影| 国产精品国产三级国产aⅴ浪潮| 久久精品国产一区二区三区| 欧美一区二三区| 最近中文字幕日韩精品| 国产一区二区三区免费视频| 欧美日韩加勒比精品一区| 亚洲第一精品久久忘忧草社区| 91美女片黄在线观看游戏| 91精品久久久久久久久久久久久| 国产精品日韩在线观看| 久久九九国产精品怡红院| 日韩av电影手机在线观看| 中文字幕免费精品一区高清| 精品久久久国产| 欧美一区二区三区艳史| 久久精视频免费在线久久完整在线看| 亚洲国产精品久久精品怡红院| 国产精品久久久999| 精品国产一区二区三区久久久| 精品综合久久久久久97| 国产91久久婷婷一区二区| 国产精品v片在线观看不卡| 国产精品久久久久久久美男| 精品久久久久久久久久| 精品国产精品自拍| 亚洲精品久久久久中文字幕欢迎你| 欧美精品久久久久| 久久中文久久字幕| 一色桃子一区二区| 亚洲精品久久久久中文字幕欢迎你| 欧美在线国产精品| 欧美精品在线播放| 亚洲午夜精品久久久久久性色| 日本欧美爱爱爱| 91精品综合久久久久久五月天| 精品国产91久久久久久老师| 国产主播喷水一区二区| 亚洲欧美视频在线| 日本19禁啪啪免费观看www| 91精品国产91久久久久| 欧美视频第一页| 日本亚洲精品在线观看| 日韩免费观看在线观看| 亚洲成人精品在线| 在线视频欧美日韩| 欧美人与物videos| 欧美乱妇高清无乱码| 57pao成人国产永久免费| 日韩免费观看网站| 欧美亚洲视频在线看网址| 久久777国产线看观看精品| 国产精品盗摄久久久| 中文字幕日韩在线播放| 日韩美女在线看| 国产91精品视频在线观看| 日韩在线视频中文字幕| 日韩在线免费观看视频| 96sao精品视频在线观看| 91精品在线影院| 欧美成aaa人片免费看| 91九色视频在线| 高清在线视频日韩欧美| 欧美日本啪啪无遮挡网站| 91久久久久久国产精品| 7777kkkk成人观看| 欧美最猛性xxxxx亚洲精品| 精品国产91乱高清在线观看| 欧美久久精品一级黑人c片|