對象序列化實驗_第1頁
對象序列化實驗_第2頁
對象序列化實驗_第3頁
對象序列化實驗_第4頁
對象序列化實驗_第5頁
已閱讀5頁,還剩17頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

電子科技大學(xué)實驗報告學(xué)生姓名:學(xué)號:指導(dǎo)教師:一、實驗室名稱:Linux環(huán)境高級編程實驗室二、實驗工程名稱:對象序列化實驗三、實驗學(xué)時:8學(xué)時四、實驗?zāi)康模菏煜じ镜膶ο笮蛄谢椒▽嶒瀮?nèi)容:共進行5個版本的開發(fā):版本1:將一個類的一個對象序列化到文件版本2:將一個類的多個對象序列化到文件版本3:將兩個類的多個對象序列化到文件版本4:按照面向?qū)ο蟮姆椒?,解決多個類的多個對象序列化到文件的問題版本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()//虛函數(shù){}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)//關(guān)閉文件 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;}運行結(jié)果:如圖1所示圖1:test_1運行結(jié)果實驗二: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)//函數(shù)重載 { 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++)//寫入數(shù)組 { 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)//讀出數(shù)組 { vec.push_back(ex); } else break; } close(fd); returntrue; }};intmain(){{ test_2ex1(6),ex2(7),ex3(9);//序列化數(shù)組 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;}運行結(jié)果如圖2所示:圖2:test_2運行結(jié)果實驗三: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;}運行結(jié)果如圖3所示:圖3:test_3運行結(jié)果實驗四: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;}運行結(jié)果如圖4所示:圖4:test_4運行結(jié)果實驗五: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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論