对象io技术的模拟实现

对象io技术的模拟实现

ID:31789546

大小:57.07 KB

页数:4页

时间:2019-01-18

对象io技术的模拟实现_第1页
对象io技术的模拟实现_第2页
对象io技术的模拟实现_第3页
对象io技术的模拟实现_第4页
资源描述:

《对象io技术的模拟实现》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、对象10技术的模拟实现何洪辉①;母军臣②(①河南大学计算中心,开封475004;②开封大学软件学院,开封475004)摘要:C++对象是存活于内存中的,但是由于RAM的易失性,需要将存活于内存中的对象,通过I/O技术及时地交换到外存中,以保证对象的持久存在(对象I/O技术也称为对象的持久化,即Persistence),所以对象I/O技术也成了C++中的一个重要操作。对象I/O技术的实现需要为对象增加一些额外的运行时信息,即RTTI,技术上的复杂性增加了开发人员所理解对象I/O的难度。本文通过对一个对象I/O技术的模拟实现,深入探讨了对象I/O技术的实

2、现机制。关键词:RTTI;对象I/O;对象持久化中图分类号:TP311文献标识码:A文章编号:1006-4311(2010)09-0019-020引言我们知道C++对象是“存活”在RAM中的,由于RAM的易失性⑴,程序需要将对象存入磁盘中,将来需要时再把对象读入内存加以恢复,这样一来就好像对象一直“活”着一样,因此对象的持久化是C++中的一个非常重要的操作。许多程序员可能有这样的误区,利用下面的代码:saveClassName();className=readClassName();p=newclassName;不就轻松实现对象的保存和恢复了吗?需要

3、指出的是,在C++中,是通newA而非new“A”(或className=“A”,newclassName)实例化A的对象。换句话说,试图利用下面的代码className=readClassName();p二newclassName;来达到通过类的字符串名称动态创建对象的做法是根木行不通的,因为p=newclassName根木无法通过编译![2]由此我们得出对象的持久化需要的两个条件:①获取对象所属类的名称的能力;②能根据类的字符串名字动态创建对象的能力。这两种能力的获得a前有两种解决方案:一是由C++编译器(compiler)提供例如Borland

4、C++4.5:二是由程序员自己加上去。本文是通过第二种方法模拟实现对象的持久化机制,从而深入探讨了对象I/O技术的实现机制。本文结构如下,首先描述了对象持久化的实现,其次对实现进行了验证,最后是论文进行总结。1对象持久化的实现为了说明问题而又不失一般性,我们假定有三个类,分别是Object,A和B,其中A和B都派生于Object,类的定义如下:为了让对象具备持久化的两个条件,需要依次为对象添加如下信息。1.1为每个类增加对象创建函数CreatObjecto1.2增加类的识别信息(类名称或ID等)以及继承信息,由于这部分信息比较多,可以将其整合到一个结

5、构体StructClassinfo中。Classinfo中保存有两个链表:类的继承链表和程序中所有类的类型信息链表。类的识别能力就由这两个链表来完成。换句话说,我们希望在main函数执行之前内存中就存在如图1所示的两个链表。其中类的继承链表是由StructClassinfo的带参构造函数完成的(在VC++中,结构体也可以有构造函数),而类的类型信息链表则是由Classlnfolnit类完成的。StructClassinfo和Classlnfolnit的定义。注意,链表的创建是在它们的构造函数中完成的。最后一步,将类型信息作为类的静态的成员变量添加进来

6、,并为每个类实例化静态的初始化类,目的是在main函数执行之前得到图1所示的两个链表。在这要强调一下static关键字的作用:①如果类的成员变量被Static关键字所修饰,则这该属性不是为类中的每个对象分别拥有,而是共用,其引用形式不是对象成员变量,而是类成员变量,即不需要市里实例化对象就可以使用。成员函数也与此相仿[3]。②如果对象(包括作为类成员的对象),如initObject、Objectinfo等,被说明为Static,则这些对象是在main函数执行之前就已经存在了,换句话说,这些对象的构造函数是在main函数调用之前就已经被调用了。因此在m

7、ain函数执行之前,内存中就已经存在着图1所示的链表就可以理解了。我们添加的RTTI信息能否有效的支持对象的持久化可以由试验来验证。2试验该试验主要验证了对象持久化必须具备的两个能力,即动态创建对象能力和获取对象所属类的能力。试验的环境如下:操作系统WindowsXPsp2,IDE环境是VC++6.0SP6c如需要全部源代码可与作者联系(hehh6@henu.edu.cn)□通过对象增加的RTTI信息(增加的静态成员变量),获取对象所属类的能力自然具备。动态创建对象能力实际上就是根据类的字符串名称来实例化对象的能力,在图1所示链表的支持下,该功能可以

8、非常轻松的实现。思路如下:通过Classinfo::pFirstClass查找类名匹配的Classinfo,

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。