首页 > 其他 > 详细

将一个类的多个对象序列化到文件

时间:2021-05-13 19:27:35      阅读:10      评论:0      收藏:0      [点我收藏+]
  1 #include<stdio.h>
  2 #include<iostream>
  3 #include<fcntl.h>
  4 #include<sys/types.h>
  5 #include<sys/stat.h>
  6 #include<vector>
  7 #include <unistd.h>
  8 using namespace std;
  9 
 10 class A
 11 {
 12 private:
 13     int i;
 14 public:
 15     A(){
 16         i  = 0;
 17     }
 18     explicit A(int j){
 19         i = j;
 20     }
 21     virtual ~A(){
 22 
 23     }
 24 public:
 25   void f(){
 26     cout<<"in f() "<<i<<endl;
 27   }
 28 public:
 29   bool Serialize(const char* pFilePath){//序列化
 30       int fd = open(pFilePath,O_RDWR | O_CREAT | O_TRUNC, 0);//打开文件,如果文件不存在,就创建文件
 31       cout << "begin Serialize"<< endl;//给个提示
 32       if(fd == -1){//如果说打开文件或者创建文件错误,返回错误
 33           cout << "Serialize open error" << endl;
 34           return false;
 35       }
 36       if (write(fd,&i,sizeof(int)) == -1)//如果说向文件里面写入数据时出错,出错原因有磁盘满,没有访问权限,超过了给定进程的文件长度等
 37       {
 38        cout << "Serialize write error" << endl;
 39           close(fd);//关闭文件
 40           return false;//返回错误
 41       }
 42       cout << "Serialize finish" << endl;
 43       return true;//如果上述打开与写都没有错误,那么则序列化成功
 44   }
 45   bool Deserialize(const char* pFilePath){//反序列化
 46       int fd = open(pFilePath,O_RDWR);//用读写的方式打开文件
 47       cout << "Deserialize begin" << endl;
 48       if (fd == -1)//打开文件错误
 49       {
 50           cout <<"Deserialize open error"<<endl;
 51           return false;//返回错误
 52       }
 53       int r = read(fd,&i,sizeof(int));//从序列化的文件读出数据
 54       if (r == -1)//读文件出错
 55       {
 56           cout << "Deserialize read error";
 57           close(fd);//关闭文件
 58           return false;//返回错误
 59       }
 60       if (close(fd) == -1){//如果关闭文件错误
 61       cout << "Deserialize close error" << endl;
 62           return false;//返回错误
 63       }
 64       cout << "Deserialize finish" << endl;
 65       return true;//上述操作都成功,那么则反序列化成功
 66   }
 67   bool Serialize(int fd) const
 68   {
 69       if(-1==fd)
 70       return false;
 71       
 72       if(write(fd,&i,sizeof(int))==-1)
 73       return false;
 74       
 75      return true;
 76   }
 77   bool Deserialize(int fd)
 78   {    
 79       if(-1==fd)
 80       return false;
 81       
 82       int r=read(fd,&i,sizeof(int));
 83       if((0==r)||(-1==r))
 84       return false;
 85       
 86       return true;
 87   } 
 88 };
 89 class SerializerForAs
 90 {
 91   public:
 92      SerializerForAs()
 93      {}
 94      virtual ~SerializerForAs()
 95      {
 96      }
 97   
 98   public:
 99      bool Serialize(const char *pFilePath, const std::vector<A>& v)
100      {
101          int fd = open(pFilePath,O_RDWR | O_CREAT | O_TRUNC, 0);
102          if(-1==fd)
103          return false;
104          
105          for(int i=0;i<v.size();i++)
106          {
107         v[i].Serialize(fd);
108     }
109     close(fd);
110     return true;
111      }
112       bool Deserialize(const char *pFilePath, std::vector<A>& v)
113       {
114           int fd=open(pFilePath,O_RDWR);
115           if(-1==fd)
116           return false;
117           
118           for(;;)
119           {
120        A a;
121        if(a.Deserialize(fd)==true)
122        {
123            v.push_back(a);
124        }
125        else
126            break;
127     }
128     
129     close(fd);
130     
131     return true;
132     }
133 };
134 int main()
135 {
136    
137     A a1(1),a2(2),a3(3);
138     
139     std::vector<A> v;
140     v.push_back(a1);
141     v.push_back(a2);
142     v.push_back(a3);
143     
144     SerializerForAs s;
145     s.Serialize("data1.txt",v);
146       s.Deserialize("a1.txt",v);
147       for(int i=0;i<3;i++)
148       {
149         v[i].f();
150     }
151  
152  return 0;
153 }

 

将一个类的多个对象序列化到文件

原文:https://www.cnblogs.com/xmthh/p/14764252.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!