Linux高级编程实验实验2报告文档格式.docx
《Linux高级编程实验实验2报告文档格式.docx》由会员分享,可在线阅读,更多相关《Linux高级编程实验实验2报告文档格式.docx(13页珍藏版)》请在冰豆网上搜索。
学习序列化原理与方法,掌握基本的序列化技巧
五、实验内容:
●版本1:
将一个类的一个对象序列化到文件
●版本2:
将一个类的多个对象序列化到文件
●版本3:
将两个类的多个对象序列化到文件
●版本4:
按照面向对象的方法,解决多个类的多个对象序列化到文件的问题
●版本5:
序列化的目的地不仅可以是文件,还可以是其他,即可配置性
六、实验步骤:
1、版本一程序分析:
源程序如下,功能是将一个类的一个对象(电话号码)序列化到文件:
#include<
fcntl.h>
iostream>
vector>
#include<
string.h>
classSAD//SerializeAndDeserialize
{
public:
SAD()//构造函数。
{
tel0=tel1=0;
//将电话号码分成两个int变量保存。
}
explicitSAD(longintm,longintk)
tel0=m;
tel1=k;
virtual~SAD()
/*使用虚析构。
在析构时防止只析构基类而不析构派生类的状况发生,造成内存泄漏。
*/
voidreshow()//用于打印出变量的值。
std:
:
cout<
<
"
TELofrecovery:
<
tel0<
tel1<
endl;
voidshow()//用于打印出电话的值。
TELbeforeSerialize:
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)))&
&
(:
tel1,sizeof(longint)))==-1)
/*write是用于向文件中写数据的函数。
fd只是一个整数,在open时产生。
起到一个索引的作用,进程通过PCB中的文件描述符表找到该fd所指向的文件指针filp。
从tel0的地址起,写入sizeof(longint)个字符。
:
close(fd);
//释放file结构体。
if(:
close(fd)==-1)
returntrue;
boolfanxuliehua(constchar*lujing)//反序列化,参数是文件名以及路径。
open(lujing,O_RDWR);
//以读写方式打开。
//打开失败。
intr=(:
read(fd,&
tel1,sizeof(longint)));
if(-1==r)
//读失败。
private:
longinttel0,tel1;
//电话号码赋值变量。
};
intmain()
SADa(135479,35899);
a.show();
//显示序列化前的电话号码。
a.xuliehua("
data"
);
//序列化。
SADa;
a.fanxuliehua("
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所示。
图4.1主函数代码
通过g++编译再运行得到结果如图4.2:
图4.2程序结果
5、版本五程序:
本程序的主函数如下图5.1所示:
图5.1主程序
运行结果如下图5.2所示:
图5.2运行结果
七、总结及心得体会:
在本次实验中:
1、我理解了序列化的内涵。
它是将对象的状态信息转换为可以存储或传输的形式的过程。
序列化时,把对象及其当前状态写入到临时或持久性存储区。
反序列化时,就可以通过从存储区中读取对象的状态,从而重新创建被存储的对象。
2、学会了基本的序列化操作,比如将一个类的一个对象序列化到文件、将一个类的多个对象序列化到文件、将两个类的多个对象序列化到文件以及按照面向对象的方法,解决多个类的多个对象序列化到文件的问题。
八、对本实验过程及方法、手段的改进建议:
此次实验整体顺利,同学们可以在课后尝试更多的序列化方法。
积极创新,提高技能。
该实验让我学到了许多实际的原理与思想。
老师讲课层层递进,给了我们充足时间练习。
报告评分:
指导教师签字: