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

下载本文档

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

文档简介

1、精选优质文档-倾情为你奉上电 子 科 技 大 学实 验 报 告学生姓名: 学 号: 指导教师:实验地点: 实验时间:2011.12.14一、实验室名称:Linux环境高级编程实验室二、实验项目名称:对象序列化实验三、实验学时:8学时四、实验目的:熟悉基本的对象序列化方法5、 实验内容:共进行5个版本的开发:l 版本1:将一个类的一个对象序列化到文件l 版本2:将一个类的多个对象序列化到文件l 版本3:将两个类的多个对象序列化到文件l 版本4:按照面向对象的方法,解决多个类的多个对象序列化到文件的问题l 版本5:序列化的目的地不仅可以是文件,还可以是其他,即可配置性六、实验步骤:实验一 :Tes

2、t_1.cpp:#include <fcntl.h>#include <vector>#include <iostream>using namespace std; /指定名字空间class test_1private:int x;public: test_1() int x = 0; explicit test_1(int y) x = y; virtual test_1() /虚函数 public: void file() cout << "in file(): " << x << endl; pu

3、blic: bool Serialize(const char *path) const /序列化部分 int fd = open(path, O_RDWR | O_CREAT | O_TRUNC, 0); /打开experiment文件if(-1 = fd)return false;if(write(fd, &x, sizeof(int) = -1)/写文件close(fd);return false;if(:close(fd) = -1)/关闭文件return false;return true; bool Deserialize(const char *path) /反序列化部分

4、 int fd = open(path, O_RDWR);/if(-1 = fd)return false;int red = read(fd, &x, sizeof(int);/只序列化一个值if(-1 = red)close(fd);return false;if(close(fd) = -1)return false;return true;int main() test_1 ex(1314);ex.Serialize("recored.txt"); test_1 ex;ex.Deserialize("recored.txt");ex.fi

5、le(); return 0;运行结果:如图1所示图1:test_1运行结果实验二:Test_2.cpp:#include <fcntl.h>#include <vector>#include <iostream>using namespace std;class test_2private: int x;public: test_2() int x = 0; explicit test_2(int y) x = y; virtual test_2() public: void file() cout << "in file(): &q

6、uot; << x << endl;/显示x值 public: bool Serialize(const char *Path) const int fd = open(Path, O_RDWR | O_CREAT | O_TRUNC, 0);/打开文件if(-1 = fd)return false;if(Serialize(fd) = false)/函数重载close(fd);return false;if(close(fd) = -1)return false;return true; bool Deserialize(const char *Path)int fd

7、 = open(Path, O_RDWR);if(-1 = fd)return false;if(Deserialize(fd) = false)close(fd);return false;if(close(fd) = -1)return false;return true; bool Serialize(int fd) const if(-1 = fd)return false;if(write(fd, &x, sizeof(int) = -1)/x值写入文件return false;return true; bool Deserialize(int fd) if(-1 = fd)

8、return false;int rd = read(fd, &x, sizeof(int);/读出文件中的x值if(0 = rd) | (-1 = rd)return false;return true; ;class SerializerFortest_2public: SerializerFortest_2() virtual SerializerFortest_2() public: bool Serialize(const char *Path, const vector<test_2>& vec) int fd = open(Path, O_RDWR |

9、 O_CREAT | O_APPEND, 0);/打开文件if(-1 = fd)return false;for(int x= 0; x < vec.size(); x+)/写入数组vecx.Serialize(fd);close(fd);return true; bool Deserialize(const char *Path, vector<test_2>& vec) int fd = open(Path, O_RDWR);if(-1 = fd)return false;for(;)test_2 ex;if(ex.Deserialize(fd) = true)/

10、读出数组vec.push_back(ex);elsebreak;close(fd);return true;int main() test_2 ex1(6), ex2(7), ex3(9);/序列化数组vector<test_2> vec;vec.push_back(ex1);vec.push_back(ex2);vec.push_back(ex3);SerializerFortest_2 ser;ser.Serialize("record.txt", vec); SerializerFortest_2 ser;/反序列化vector<test_2>

11、 vec;ser.Deserialize("record.txt", vec);for(int x = 0; x < 3; x+)vecx.file(); return 0;运行结果如图2所示:图2:test_2运行结果实验三:Test_3.cpp:#include <fcntl.h>#include <vector>#include <iostream>using namespace std;class test_Aprivate: int x;public: test_A() int x = 0; explicit test_A

12、(int y) x = y; virtual test_A() public: void file() cout<<"in file(): "<<x<<endl; public: bool Serialize(int fd) if(-1 = fd)return false;if(:write(fd, &x, sizeof(int) = -1)return false;return true; bool Deserialize(int fd) if(-1 = fd)return false;int rd = read(fd, &am

13、p;x, sizeof(int);if(0 = rd) | (-1 = rd)return false;return true; ;class test_Bprivate: int x; int y;public: test_B() x = 0;y = 0; explicit test_B(int k) x = k;y = k + 1; virtual test_B() public: void file() cout<<"in file(): "<<x<<" "<<y<< endl; publ

14、ic: bool Serialize(int fd) if(-1 = fd)return false;if(write(fd, &x, sizeof(int) = -1)return false;if(write(fd, &y, sizeof(int) = -1)return false;return true; bool Deserialize(int fd) if(-1 = fd)return false;int rd = read(fd, &x, sizeof(int);if(0 = rd) | (-1 = rd)return false;rd = read(fd

15、, &y, sizeof(int);if(0 = rd) | (-1 = rd)return false;return true; ;struct Serialized int nType; /0 for test_A; 1 for test_B void *pObj;class Serializerpublic: bool Serialize(const char *Path,std:vector<Serialized> &vec) int fd = open(Path, O_RDWR | O_CREAT | O_TRUNC, 0);if(-1 = fd)retu

16、rn false;for(int x = 0; x < vec.size(); x+)if(write(fd, &(vecx.nType), 4) = -1)close(fd);return false;if(0 = vecx.nType)test_A *p = (test_A *)(vecx.pObj);if(p->Serialize(fd) = false)return false;else if(1 = vecx.nType)test_B *p = (test_B *)(vecx.pObj);if(p->Serialize(fd) = false)return

17、false;if(close(fd) = -1)return false;return true; bool Deserialize(const char *Path,std:vector<Serialized>& vec) int fd = open(Path, O_RDWR);if(-1 = fd)return false;for(;)int nType;int rd = read(fd, &nType, 4);if(-1 = rd) | (0 = rd)break;if(0 = nType)test_A *p;p = new test_A();p->De

18、serialize(fd);Serialized s;s.nType = nType;s.pObj = p;vec.push_back(s);else if(1 = nType)test_B *p;p = new test_B();p->Deserialize(fd);Serialized s;s.nType = nType;s.pObj = p;vec.push_back(s);if(close(fd) = -1)return false;return true;int main() test_A ex1(2);Serialized s1;s1.nType = 0;s1.pObj =

19、&ex1;test_B b1(3);Serialized s2;s2.nType = 1;s2.pObj = &b1;test_B b2(4);Serialized s3;s3.nType = 1;s3.pObj = &b2;test_A ex2(5);Serialized s4;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);Serializer

20、 s;s.Serialize("data", vec); Serializer s;std:vector<Serialized> vec;s.Deserialize("data", vec);for(int x = 0; x < vec.size(); x+)if(vecx.nType = 0)test_A *p = (test_A *)(vecx.pObj);p->file();else if(vecx.nType = 1)test_B *p = (test_B *)(vecx.pObj);p->file();return

21、 0;运行结果如图3所示:图3:test_3运行结果实验四:Test_4.cpp:#include <fcntl.h>#include <iostream>#include <vector>using namespace std;class testSerializable/序列化虚类public:virtual bool Serialize(int fd) = 0; virtual testSerializable* Deserialize(int fd) = 0; virtual bool GetType(int& type) = 0;publi

22、c: testSerializable() virtual testSerializable() ;class test_1 : public testSerializableprivate: int i;public: test_1() i = 0; explicit test_1(int j) i = j; virtual test_1() public: void file() std:cout << "in file(): " << i << std:endl; public: virtual bool GetType(int&a

23、mp; type) type = 0;return true; virtual bool Serialize(int fd) if(-1 = fd)return false;if(:write(fd, &i, sizeof(int) = -1)/序列化return false;return true; virtual testSerializable* Deserialize(int fd)/反序列化 if(-1 = fd)return NULL;test_1 *p = new test_1();int r = :read(fd, &(p->i), sizeof(int)

24、;if(0 = r) | (-1 = r)delete p;return NULL;return p; ;class test_2 : public testSerializableprivate: int i; int j;public: test_2() i = 0;j = 0; explicit test_2(int k) i = k;j = k + 1; virtual test_2() public: void file() std:cout << "in file(): " << i << " " <

25、< j << std:endl; public: virtual bool GetType(int& type) type = 1;return true; virtual bool Serialize(int fd)/写入多个对象 if(-1 = fd)return false;if(:write(fd, &i, sizeof(int) = -1)return false;if(:write(fd, &j, sizeof(int) = -1)return false;return true; virtual testSerializable* Des

26、erialize(int fd) if(-1 = fd)return NULL;test_2 *p = new test_2();int r = :read(fd, &(p->i), sizeof(int);if(0 = r) | (-1 = r)delete p;return NULL;r = :read(fd, &(p->j), sizeof(int);if(0 = r) | (-1 = r)delete p;return NULL;return p; ;class CLSerializerprivate: std:vector<testSerializa

27、ble*> m_vSerialized;public: bool Serialize(const char *pFilePath, std:vector<testSerializable*>& v) int fd = :open(pFilePath, O_RDWR | O_CREAT | O_TRUNC, 0);if(-1 = fd)return false;for(int i = 0; i < v.size(); i+)int type;vi->GetType(type);if(:write(fd, &type, 4) = -1):close(f

28、d);return false;vi->Serialize(fd);if(:close(fd) = -1)return false;return true;bool Deserialize(const char *pFilePath, std:vector<testSerializable*>& v)int fd = :open(pFilePath, O_RDWR);if(-1 = fd) return false;for(;) int nType; int r = :read(fd, &nType, 4); if(-1 = r) | (0 = r)break

29、; int type; for(int i = 0; i < m_vSerialized.size(); i+) m_vSerializedi->GetType(type);if(type = nType) testSerializable *p = m_vSerializedi->Deserialize(fd); if(p != NULL)v.push_back(p); if(:close(fd) = -1) return false;return true; void Register(testSerializable *pSerialized) m_vSerialize

30、d.push_back(pSerialized); ;int main() test_1 ex1(2);test_2 e1(3);test_2 e2(4);test_1 ex2(5);std:vector<testSerializable*> v;v.push_back(&ex1);v.push_back(&e1);v.push_back(&e2);v.push_back(&ex2); CLSerializer s;s.Serialize("data", v); CLSerializer s;test_1 a;test_2 b;s

31、.Register(&a);s.Register(&b);std:vector<testSerializable*> v;s.Deserialize("data", v);for(int i = 0; i < v.size(); i+)test_1 *p = dynamic_cast<test_1 *>(vi);if(p != NULL)p->file();test_2 *q = dynamic_cast<test_2 *>(vi);if(q != NULL)q->file();return 0;运行结果

32、如图4所示:图4:test_4运行结果实验五:Test_5.cpp:#include <fcntl.h>#include <iostream>#include <vector>#include <strings.h>#include <stdio.h>class ILSerializable/虚类public: virtual bool Serialize(int fd) = 0; virtual ILSerializable* Deserialize(int fd) = 0; virtual bool GetType(int&

33、; type) = 0;public: ILSerializable() virtual ILSerializable() ;class A : public ILSerializableprivate: int i;public: A() i = 0; explicit A(int j) i = j; virtual A() public: void f() std:cout << "in f(): " << i << std:endl; public: virtual bool GetType(int& type) type

34、= 0;return true; virtual bool Serialize(int fd)/文件可配置 if(-1 = fd)return false;if(:write(fd, &i, sizeof(int) = -1)return false;return true; virtual ILSerializable* Deserialize(int fd) if(-1 = fd)return NULL;A *p = new A();int r = :read(fd, &(p->i), sizeof(int);/此处反序列化if(0 = r) | (-1 = r)de

35、lete p;return NULL;return p;class B : public ILSerializableprivate: int i; int j;public: B() i = 0;j = 0; explicit B(int k) i = k;j = k + 1; virtual B() public: void f() std:cout << "in f(): " << i << " " << j << std:endl; public: virtual bool GetTyp

36、e(int& type)/定义B类的标示符 type = 1;return true; virtual bool Serialize(int fd) if(-1 = fd)return false;if(:write(fd, &i, sizeof(int) = -1)return false;if(:write(fd, &j, sizeof(int) = -1)return false;return true; virtual ILSerializable* Deserialize(int fd) if(-1 = fd)return NULL;B *p = new B(

37、);int r = :read(fd, &(p->i), sizeof(int);if(0 = r) | (-1 = r)delete p;return NULL;r = :read(fd, &(p->j), sizeof(int);if(0 = r) | (-1 = r)delete p;return NULL;return p;class CLSerializerprivate: std:vector<ILSerializable*> m_vSerialized;public: bool Serialize(const char *pFilePath

38、, std:vector<ILSerializable*>& v) int fd = :open(pFilePath, O_RDWR | O_CREAT | O_TRUNC, 0);if(-1 = fd)return false;for(int i = 0; i < v.size(); i+)int type;vi->GetType(type);if(:write(fd, &type, 4) = -1)/写入类别:close(fd);return false;vi->Serialize(fd);if(:close(fd) = -1) return

39、false;return true; bool Deserialize(const char *pFilePath, std:vector<ILSerializable*>& v) int fd = :open(pFilePath, O_RDWR);if(-1 = fd)return false;for(;)int nType;int r = :read(fd, &nType, 4);if(-1 = r) | (0 = r)break;int type;for(int i = 0; i < m_vSerialized.size(); i+)m_vSerializedi->GetType(type);if(type = nType)/判断类别ILSeria

温馨提示

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

评论

0/150

提交评论