首页 ┆ 网站地图 ┆ 在线留言 ┆ 游戏资讯 ┆ 资源下载  ┆ 端午节祝福 
设为首页
加入收藏
联系我们
热门关键字: .net应用  操作系统  Dreamweaver  WinRAR  网络推广
高级搜索
您当前的位置: 主页>C/C++>C++>如何在C++中创建持久对象的方法
如何在C++中创建持久对象的方法
来源: 发布时间:2008-06-17 发布人: 浏览: 人次   字体: [ ]  

    持久对象(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;

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


共2页: 上一页 1 [2] 下一页
↓下一篇:没有了
相 关 文 章   发布商链接
·C语言程序设计入门学习六步曲
·C++不是万能的
·实例详细介绍各种字符集编码转换问题...
·C++实现仿Office风格的颜色选取框代...
·在Linux下验证日期是否合法
·祥解C++中的this指针
·vc读取XML文件中的文本代码
·C++程序中内存划分介绍
·C++计算含括号四则表达式的模板
·vc命令行调用winrar.exe进行文件解压...
 §最新评论:(评论内容只代表网友观点,与本站立场无关!)
网名: 验证码:  【所有评论】【↑返回顶部
评 分: 12 345
评论内容:(不能超过500字,请自觉遵守互联网相关政策法规。[按 Ctrl+Enter 可直接提交]
注意:请勿在本站发布政治话题、色情及违反法律的内容。
IT知道网 声明:刊登此文章是为了传递更多信息,文章内容仅供参考,转载请注明出处。
推 荐 文 章
·c++实现获取IE缓存文件夹中的
·C++中regex库中静态正则表达...
·VC++编写交互程序时将打印结...
·实例讲解C++中CopyFileEx函数
·c++获取Windows 2000/XP操作...
·C++语言中多重继承下的虚函数
·什么是单例模式?C++中单例模...
·基于C++的DES加密算法实现代...
·vc命令行调用winrar.exe进行...
·C++计算含括号四则表达式的模
·C++程序中内存划分介绍
·vc读取XML文件中的文本代码
·祥解C++中的this指针
·在Linux下验证日期是否合法
·C++实现仿Office风格的颜色选
热 门 文 章
·实例详细介绍各种字符集编码...
·基于C++的DES加密算法实现代...
·vc读取XML文件中的文本代码
·vc命令行调用winrar.exe进行...
·祥解C++中的this指针
·C语言程序设计入门学习六步曲...
·C++语言中多重继承下的虚函数...
·C++不是万能的
·什么是单例模式?C++中单例模...
·在Linux下验证日期是否合法
·C++程序中内存划分介绍
·实例讲解C++中CopyFileEx函数...
·C++计算含括号四则表达式的模...
·C++实现仿Office风格的颜色选...
·VC++编写交互程序时将打印结...
网站首页 - 关于本站 - 加入收藏 - 网站地图 - 友情连接 - 在线留言 - 联系我们 - 返回顶部
Copyright © 2007 IT知道网.[冀ICP备07026896号]. All Rights Reserved .