对象序列化实验.docx
- 文档编号:28558852
- 上传时间:2023-07-19
- 格式:DOCX
- 页数:37
- 大小:147.72KB
对象序列化实验.docx
《对象序列化实验.docx》由会员分享,可在线阅读,更多相关《对象序列化实验.docx(37页珍藏版)》请在冰豆网上搜索。
对象序列化实验
电子科技大学
实验报告
学生:
学号:
指导教师:
实验地点:
实验时间:
2011.12.14
一、实验室名称:
Linux环境高级编程实验室
二、实验项目名称:
对象序列化实验
三、实验学时:
8学时
四、实验目的:
熟悉基本的对象序列化方法
五、实验容:
共进行5个版本的开发:
●版本1:
将一个类的一个对象序列化到文件
●版本2:
将一个类的多个对象序列化到文件
●版本3:
将两个类的多个对象序列化到文件
●版本4:
按照面向对象的方法,解决多个类的多个对象序列化到文件的问题
●版本5:
序列化的目的地不仅可以是文件,还可以是其他,即可配置性
六、实验步骤:
实验一:
Test_1.cpp:
#include
#include
#include
usingnamespacestd;//指定名字空间
classtest_1
{
private:
intx;
public:
test_1()
{
intx=0;
}
explicittest_1(inty)
{
x=y;
}
virtual~test_1()//虚函数
{
}
public:
voidfile()
{
cout<<"infile():
"< } public: boolSerialize(constchar*path)const//序列化部分 { intfd=open(path,O_RDWR|O_CREAT|O_TRUNC,0);//打开experiment文件 if(-1==fd) returnfalse; if(write(fd,&x,sizeof(int))==-1)//写文件 { close(fd); returnfalse; } if(: : close(fd)==-1)//关闭文件 returnfalse; returntrue; } boolDeserialize(constchar*path)//反序列化部分 { intfd=open(path,O_RDWR);// if(-1==fd) returnfalse; intred=read(fd,&x,sizeof(int));//只序列化一个值 if(-1==red) { close(fd); returnfalse; } if(close(fd)==-1) returnfalse; returntrue; } }; intmain() { { test_1ex(1314); ex.Serialize("recored.txt"); } { test_1ex; ex.Deserialize("recored.txt"); ex.file(); } return0; } 运行结果: 如图1所示 图1: test_1运行结果 实验二: Test_2.cpp: #include #include #include usingnamespacestd; classtest_2 { private: intx; public: test_2() { intx=0; } explicittest_2(inty) { x=y; } virtual~test_2() { } public: voidfile() { cout<<"infile(): "< } public: boolSerialize(constchar*Path)const { intfd=open(Path,O_RDWR|O_CREAT|O_TRUNC,0);//打开文件 if(-1==fd) returnfalse; if(Serialize(fd)==false)//函数重载 { close(fd); returnfalse; } if(close(fd)==-1) returnfalse; returntrue; } boolDeserialize(constchar*Path) { intfd=open(Path,O_RDWR); if(-1==fd) returnfalse; if(Deserialize(fd)==false) { close(fd); returnfalse; } if(close(fd)==-1) returnfalse; returntrue; } boolSerialize(intfd)const { if(-1==fd) returnfalse; if(write(fd,&x,sizeof(int))==-1)//x值写入文件 returnfalse; returntrue; } boolDeserialize(intfd) { if(-1==fd) returnfalse; intrd=read(fd,&x,sizeof(int));//读出文件中的x值 if((0==rd)||(-1==rd)) returnfalse; returntrue; } }; classSerializerFortest_2 { public: SerializerFortest_2() { } virtual~SerializerFortest_2() { } public: boolSerialize(constchar*Path,constvector { intfd=open(Path,O_RDWR|O_CREAT|O_APPEND,0);//打开文件 if(-1==fd) returnfalse; for(intx=0;x { vec[x].Serialize(fd); } close(fd); returntrue; } boolDeserialize(constchar*Path,vector { intfd=open(Path,O_RDWR); if(-1==fd) returnfalse; for(;;) { test_2ex; if(ex.Deserialize(fd)==true)//读出数组 { vec.push_back(ex); } else break; } close(fd); returntrue; } }; intmain() { { test_2ex1(6),ex2(7),ex3(9);//序列化数组 vector vec.push_back(ex1); vec.push_back(ex2); vec.push_back(ex3); SerializerFortest_2ser; ser.Serialize("record.txt",vec); } { SerializerFortest_2ser;//反序列化 vector ser.Deserialize("record.txt",vec); for(intx=0;x<3;x++) { vec[x].file(); } } return0; } 运行结果如图2所示: 图2: test_2运行结果 实验三: Test_3.cpp: #include #include #include usingnamespacestd; classtest_A { private: intx; public: test_A() { intx=0; } explicittest_A(inty) { x=y; } virtual~test_A() { } public: voidfile() { cout<<"infile(): "< } public: boolSerialize(intfd) { if(-1==fd) returnfalse; if(: : write(fd,&x,sizeof(int))==-1) returnfalse; returntrue; } boolDeserialize(intfd) { if(-1==fd) returnfalse; intrd=read(fd,&x,sizeof(int)); if((0==rd)||(-1==rd)) returnfalse; returntrue; } }; classtest_B { private: intx; inty; public: test_B() { x=0; y=0; } explicittest_B(intk) { x=k; y=k+1; } virtual~test_B() { } public: voidfile() { cout<<"infile(): "< } public: boolSerialize(intfd) { if(-1==fd) returnfalse; if(write(fd,&x,sizeof(int))==-1) returnfalse; if(write(fd,&y,sizeof(int))==-1) returnfalse; returntrue; } boolDeserialize(intfd) { if(-1==fd) returnfalse; intrd=read(fd,&x,sizeof(int)); if((0==rd)||(-1==rd)) returnfalse; rd=read(fd,&y,sizeof(int)); if((0==rd)||(-1==rd)) returnfalse; returntrue; } }; structSerialized { intnType;//0fortest_A;1fortest_B void*pObj; }; classSerializer { public: boolSerialize(constchar*Path,std: : vector { intfd=open(Path,O_RDWR|O_CREAT|O_TRUNC,0); if(-1==fd) returnfalse; for(intx=0;x { if(write(fd,&(vec[x].nType),4)==-1) { close(fd); returnfalse; } if(0==vec[x].nType) { test_A*p=(test_A*)(vec[x].pObj); if(p->Serialize(fd)==false) returnfalse; } elseif(1==vec[x].nType) { test_B*p=(test_B*)(vec[x].pObj); if(p->Serialize(fd)==false) returnfalse; } } if(close(fd)==-1) returnfalse; returntrue; } boolDeserialize(constchar*Path,std: : vector { intfd=open(Path,O_RDWR); if(-1==fd) returnfalse; for(;;) { intnType; intrd=read(fd,&nType,4); if((-1==rd)||(0==rd)) break; if(0==nType) { test_A*p; p=newtest_A(); p->Deserialize(fd); Serializeds; s.nType=nType; s.pObj=p; vec.push_back(s); } elseif(1==nType) { test_B*p; p=newtest_B(); p->Deserialize(fd); Serializeds; s.nType=nType; s.pObj=p; vec.push_back(s); } } if(close(fd)==-1) returnfalse; returntrue; } }; intmain() { { test_Aex1 (2); Serializeds1; s1.nType=0; s1.pObj=&ex1; test_Bb1(3); Serializeds2; s2.nType=1; s2.pObj=&b1; test_Bb2(4); Serializeds3; s3.nType=1; s3.pObj=&b2; test_Aex2(5); Serializeds4; s4.nType=0; s4.pObj=&ex2; std: : vector vec.push_back(s1); vec.push_back(s2); vec.push_back(s3); vec.push_back(s4); Serializers; s.Serialize("data",vec); } { Serializers; std: : vector s.Deserialize("data",vec); for(intx=0;x { if(vec[x].nType==0) { test_A*p=(test_A*)(vec[x].pObj); p->file(); } elseif(vec[x].nType==1) { test_B*p=(test_B*)(vec[x].pObj); p->file(); } } } return0; } 运行结果如图3所示: 图3: test_3运行结果 实验四: Test_4.cpp: #include #include #include usingnamespacestd; classtestSerializable//序列化虚类 { public: virtualboolSerialize(intfd)=0; virtualtestSerializable*Deserialize(intfd)=0; virtualboolGetType(int&type)=0; public: testSerializable() { } virtual~testSerializable() { } }; classtest_1: publictestSerializable { private: inti; public: test_1() { i=0; } explicittest_1(intj) { i=j; } virtual~test_1() { } public: voidfile() { std: : cout<<"infile(): "< : endl; } public: virtualboolGetType(int&type) { type=0; returntrue; } virtualboolSerialize(intfd) { if(-1==fd) returnfalse; if(: : write(fd,&i,sizeof(int))==-1)//序列化 returnfalse; returntrue; } virtualtestSerializable*Deserialize(intfd)//反序列化 { if(-1==fd) returnNULL; test_1*p=newtest_1(); intr=: : read(fd,&(p->i),sizeof(int)); if((0==r)||(-1==r)) { deletep; returnNULL; } returnp; } }; classtest_2: publictestSerializable { private: inti; intj; public: test_2() { i=0; j=0; } explicittest_2(intk) { i=k; j=k+1; } virtual~test_2() { } public: voidfile() { std: : cout<<"infile(): "< : endl; } public: virtualboolGetType(int&type) { type=1; returntrue; } virtualboolSerialize(intfd)//写入多个对象 { if(-1==fd) returnfalse; if(: : write(fd,&i,sizeof(int))==-1) returnfalse; if(: : write(fd,&j,sizeof(int))==-1) returnfalse; returntrue; } virtualtestSerializable*Deserialize(intfd) { if(-1==fd) returnNULL; test_2*p=newtest_2(); intr=: : read(fd,&(p->i),sizeof(int)); if((0==r)||(-1==r)) { deletep; returnNULL; } r=: : read(fd,&(p->j),sizeof(int)); if((0==r)||(-1==r)) { deletep; returnNULL; } returnp; } }; classCLSerializer { private: std: : vector public: boolSerialize(constchar*pFilePath,std: : vector { intfd=: : open(pFilePath,O_RDWR|O_CREAT|O_TRUNC,0); if(-1==fd) returnfalse; for(inti=0;i { inttype; v[i]->GetType(type); if(: : write(fd,&type,4)==-1) { : : close(fd); returnfalse; } v[i]->Serialize(fd); } if(: : close(fd)==-1) returnfalse; return
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 对象 序列 实验
![提示](https://static.bdocx.com/images/bang_tan.gif)