对象序列化实验_第1页
对象序列化实验_第2页
对象序列化实验_第3页
对象序列化实验_第4页
对象序列化实验_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

电子科技大学实验报告学生姓名:学号:指导教师:一、实验室名称:Linux环境高级编程实验室二、实验工程名称:对象序列化实验三、实验学时:8学时四、实验目的:熟悉根本的对象序列化方法实验内容:共进行5个版本的开发:版本1:将一个类的一个对象序列化到文件版本2:将一个类的多个对象序列化到文件版本3:将两个类的多个对象序列化到文件版本4:按照面向对象的方法,解决多个类的多个对象序列化到文件的问题版本5:序列化的目的地不仅可以是文件,还可以是其他,即可配置性六、实验步骤:实验一:Test_1.cpp:#include<fcntl.h>#include<vector>#include<iostream>usingnamespacestd;//指定名字空间classtest_1{private: intx;public:test_1(){ intx=0;}explicittest_1(inty){ x=y;}virtual~test_1()//虚函数{}public:voidfile(){ cout<<"infile():"<<x<<endl;}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<fcntl.h>#include<vector>#include<iostream>usingnamespacestd;classtest_2{private:intx;public:test_2(){ intx=0;}explicittest_2(inty){ x=y;}virtual~test_2(){}public:voidfile(){ cout<<"infile():"<<x<<endl;//显示x值}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<test_2>&vec){ intfd=open(Path,O_RDWR|O_CREAT|O_APPEND,0);//翻开文件 if(-1==fd) returnfalse; for(intx=0;x<vec.size();x++)//写入数组 { vec[x].Serialize(fd); } close(fd); returntrue;}boolDeserialize(constchar*Path,vector<test_2>&vec){ 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<test_2>vec; vec.push_back(ex1); vec.push_back(ex2); vec.push_back(ex3); SerializerFortest_2ser; ser.Serialize("record.txt",vec);}{ SerializerFortest_2ser;//反序列化 vector<test_2>vec; ser.Deserialize("record.txt",vec); for(intx=0;x<3;x++) { vec[x].file(); }} return0;}运行结果如图2所示:图2:test_2运行结果实验三:Test_3.cpp:#include<fcntl.h>#include<vector>#include<iostream>usingnamespacestd;classtest_A{private:intx;public:test_A(){ intx=0;}explicittest_A(inty){ x=y;}virtual~test_A(){}public:voidfile(){ cout<<"infile():"<<x<<endl;}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():"<<x<<""<<y<<endl;}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_Bvoid*pObj;};classSerializer{public:boolSerialize(constchar*Path,std::vector<Serialized>&vec){ intfd=open(Path,O_RDWR|O_CREAT|O_TRUNC,0); if(-1==fd) returnfalse; for(intx=0;x<vec.size();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<Serialized>&vec){ 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<Serialized>vec; vec.push_back(s1); vec.push_back(s2); vec.push_back(s3); vec.push_back(s4); Serializers; s.Serialize("data",vec); }{ Serializers; std::vector<Serialized>vec; s.Deserialize("data",vec); for(intx=0;x<vec.size();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<fcntl.h>#include<iostream>#include<vector>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():"<<i<<std::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():"<<i<<""<<j<<std::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<testSerializable*>m_vSerialized;public:boolSerialize(constchar*pFilePath,std::vector<testSerializable*>&v){ intfd=::open(pFilePath,O_RDWR|O_CREAT|O_TRUNC,0); if(-1==fd) returnfalse; for(inti=0;i<v.size();i++) { inttype; v[i]->GetType(type); if(::write(fd,&type,4)==-1) { ::close(fd); returnfalse; } v[i]->Serialize(fd); } if(::close(fd)==-1) returnfalse; returntrue; } boolDeserialize(constchar*pFilePath,std::vector<testSerializable*>&v) { intfd=::open(pFilePath,O_RDWR); if(-1==fd) returnfalse; for(;;) { intnType; intr=::read(fd,&nType,4); if((-1==r)||(0==r)) break; inttype; for(inti=0;i<m_vSerialized.size();i++) { m_vSerialized[i]->GetType(type); if(type==nType) { testSerializable*p=m_vSerialized[i]->Deserialize(fd); if(p!=NULL) v.push_back(p); } } } if(::close(fd)==-1) returnfalse; returntrue;}voidRegister(testSerializable*pSerialized){ m_vSerialized.push_back(pSerialized);}};intmain(){{ test_1ex1(2); test_2e1(3); test_2e2(4); test_1ex2(5); std::vector<testSerializable*>v; v.push_back(&ex1); v.push_back(&e1); v.push_back(&e2); v.push_back(&ex2);CLSerializers; s.Serialize("data",v);}{ CLSerializers; test_1a; test_2b; s.Register(&a); s.Register(&b); std::vector<testSerializable*>v; s.Deserialize("data",v); for(inti=0;i<v.size();i++) { test_1*p=dynamic_cast<test_1*>(v[i]); if(p!=NULL) p->file(); test_2*q=dynamic_cast<test_2*>(v[i]); if(q!=NULL) q->file(); } } return0;}运行结果如图4所示:图4:test_4运行结果实验五:Test_5.cpp:#include<fcntl.h>#include<iostream>#include<vector>#include<strings.h>#include<stdio.h>classILSerializable//虚类{public:virtualboolSerialize(intfd)=0;virtualILSerializable*Deserialize(intfd)=0;virtualboolGetType(int&type)=0;public:ILSerializable(){}virtual~ILSerializable(){}};classA:publicILSerializable{ private:inti;public:A(){ i=0;}explicitA(intj){ i=j;}virtual~A(){}public:voidf(){ std::cout<<"inf():"<<i<<std::endl;}public:virtualboolGetType(int&type){ type=0; returntrue;}virtualboolSerialize(intfd)//文件可配置{ if(-1==fd) returnfalse; if(::write(fd,&i,sizeof(int))==-1) returnfalse; returntrue;}virtualILSerializable*Deserialize(intfd){ if(-1==fd) returnNULL; A*p=newA(); intr=::read(fd,&(p->i),sizeof(int));//此处反序列化 if((0==r)||(-1==r)) { deletep; returnNULL; } returnp; }};classB:publicILSerializable{private:inti;intj;public:B(){ i=0; j=0;}explicitB(intk){ i=k; j=k+1;}virtual~B(){}public:voidf(){ std::cout<<"inf():"<<i<<""<<j<<std::endl;}public:virtualboolGetType(int&type)//定义B类的标示符{ 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;}virtualILSerializable*Deserialize(intfd){ if(-1==fd) returnNULL; B*p=newB(); 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<ILSerializable*>m_vSerialized;public:boolSerialize(constchar*pFilePath,std::vector<ILSerializable*>&v){ intfd=::open(pFilePath,O_RDWR|O_CREAT|O_TRUNC,0); if(-1==fd) returnfalse; for(inti=0;i<v.size();i++) { inttype; v[i]->GetType(type); if(::write(fd,&type,4)==-1)//写入类别 { ::close(fd); returnfalse; } v[i]->Serialize(fd); } if(::close(fd)==-1) returnfalse; returntrue; }boolDeserialize(constchar*pFilePath,std::vector<ILSerializable*>&v){ intfd=::open(pFilePath,O_RDWR); if(-1==fd) returnfalse; for(;;) { intnType; intr=::read(fd,&nType,4); if((-1==r)||(0==r)) break; inttype; for(inti=0;i<m_vSerialized.size();i++) { m_vSerialized[i]->GetType(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论