电子科技大学实验报告学生姓名:学号:指导教师:李林实验地点:清水河主楼A2-412实验时间:2016.11.16一、实验室名称:Linux环境高级编程实验室二、实验项目名称:对象序列化实验三、实验学时:8学时四、实验目的:学习序列化原理与方法,掌握基本的序列化技巧五、实验内容:版本1:将一个类的一个对象序列化到文件版本2:将一个类的多个对象序列化到文件版本3:将两个类的多个对象序列化到文件版本4:按照面向对象的方法,解决多个类的多个对象序列化到文件的问题版本5:序列化的目的地不仅可以是文件,还可以是其他,即可配置性六、实验步骤:1、版本一程序分析:源程序如下,功能是将一个类的一个对象(电话号码)序列化到文件:#includefcntl.h#includeiostream#includevector#includestring.hclassSAD//SerializeAndDeserialize{public:SAD()//构造函数。{tel0=tel1=0;//将电话号码分成两个int变量保存。}explicitSAD(longintm,longintk){tel0=m;tel1=k;}virtual~SAD()/*使用虚析构。在析构时防止只析构基类而不析构派生类的状况发生,造成内存泄漏。*/{}public:voidreshow()//用于打印出变量的值。{std::coutTELofrecovery:tel0tel1std::endl;}public:voidshow()//用于打印出电话的值。{std::coutTELbeforeSerialize:tel0tel1std::endl;}public:boolxuliehua(constchar*lujing)const/*非静态成员函数后面加了const的成员函数可以被非const对象和const对象调用。*/{intfd=::open(lujing,O_RDWR|O_CREAT|O_TRUNC,0);/*open函数位于fcntl.h中。open函数用于打开和创建文件。pFilePath表示文件名,参数O_RDWR表示以可读写方式打开文件.O_CREAT表示若欲打开的文件不存在则自动建立该文件.O_TRUNC表示若文件存在并且以可写的方式打开时,此旗标会令文件长度清为0,而原来存于该文件的资料也会消失.若所有欲核查的权限都通过了检查则返回0值,表示成功,只要有一个权限被禁止则返回-1.*/if(-1==fd)returnfalse;if((::write(fd,&tel0,sizeof(longint)))&&(::write(fd,&tel1,sizeof(longint)))==-1)/*write是用于向文件中写数据的函数。fd只是一个整数,在open时产生。起到一个索引的作用,进程通过PCB中的文件描述符表找到该fd所指向的文件指针filp。从tel0的地址起,写入sizeof(longint)个字符。*/{::close(fd);//释放file结构体。returnfalse;}if(::close(fd)==-1)returnfalse;returntrue;}boolfanxuliehua(constchar*lujing)//反序列化,参数是文件名以及路径。{intfd=::open(lujing,O_RDWR);//以读写方式打开。if(-1==fd)returnfalse;//打开失败。intr=(::read(fd,&tel0,sizeof(longint)))&&(::read(fd,&tel1,sizeof(longint)));if(-1==r){::close(fd);returnfalse;//读失败。}if(::close(fd)==-1)returnfalse;returntrue;}private:longinttel0,tel1;//电话号码赋值变量。};intmain(){{SADa(135479,35899);a.show();//显示序列化前的电话号码。a.xuliehua(data);//序列化。}{SADa;a.fanxuliehua(data);a.reshow();//显示序列化后的电话号码。}return0;}执行编译并运行后的运行结果如下图1.1:图1.1版本一序列化运行结果流程图如下:图1.2版本一程序流程图2、版本二程序分析:部分原代码如下图2.1,功能为将一个类的多个对象序列化到文件(截图是在图形界面的虚拟终端下进行的,因为我在终端模式下查看的中文注释是乱码):(a)头文件(b)序列化子程序(c)显示程序开始初始化序列化电话号码显示数据反序列化显示恢复后号码结束(d)反序列化子程序(e)主程序图2.1版本二代码图然后切换到终端模式,g++编译运行,得到预期结果,序列化完成。图2.2运行结果3、版本三程序分析:版本三的功能是,将两个不同类的多个对象序列化到文件中。其主函数部分代码如图3.1图3.1主函数代码经过g++编译运行后,得到结果如下图3.2:图3.2运行结果其程序流程图如下3.3:图3.3程序流程图4、版本四程序分析:本程序实现了将三个不同的类的多个对象序列化到文件,采用面向对象的方法,查找变化点,抽象出需要进行序列化的基类。当又有新的类的对象,需要序列化到文件时,不需要修改已有的代码。其代码如下图4.1所示。开始初始化:得到不同类型A、B的对象a1、a2、b1、b2把上述值存入V对V进行序列化反序列化恢复为A的对象结束标志nType=0?恢复为B的对象图4.1主函数代码通过g++编译再运行得到结果如图4.2:图4.2程序结果5、版本五程序:本程序的主函数如下图5.1所示:图5.1主程序运行结果如下图5.2所示:图5.2运行结果七、总结及心得体会:在本次实验中:1、我理解了序列化的内涵。它是将对象的状态信息转换为可以存储或传输的形式的过程。序列化时,把对象及其当前状态写入到临时或持久性存储区。反序列化时,就可以通过从存储区中读取对象的状态,从而重新创建被存储的对象。2、学会了基本的序列化操作,比如将一个类的一个对象序列化到文件、将一个类的多个对象序列化到文件、将两个类的多个对象序列化到文件以及按照面向对象的方法,解决多个类的多个对象序列化到文件的问题。八、对本实验过程及方法、手段的改进建议:此次实验整体顺利,同学们可以在课后尝试更多的序列化方法。积极创新,提高技能。该实验让我学到了许多实际的原理与思想。老师讲课层层递进,给了我们充足时间练习。报告评分:指导教师签字: