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

序列化:将内存中的对象(数据)变成一个字节序。
反序列化:将字节序还原为一个对象。ios

那么这个只须要此对象写入文件,而后完成序列化;函数

反序列化就是将此对象的序列化从新反序列化测试

/**
序列化:将内存中的对象(数据)变成一个字节序。
反序列化:将字节序还原为一个对象。
*/
#include<stdio.h>
#include<iostream>
#include<fcntl.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<vector>
#include <unistd.h>
using namespace std;

class A
{
private:
    int i;//这个数表明将要序列化的数,固然这个数能够更换类型,任意类型的均可
public:
    A(){
        i  = 0;//进行初始化
    }
    //做用是代表该构造函数是显示的, 而非隐式的
    explicit A(int j){
        i = j;
    }
    virtual ~A(){//反析构函数

    }
public:
  void f(){//进行输出,反映了已经对那个进行了反序列化
    cout<<"in f()"<<i<<endl;
  }
public:
  bool Serialize(const char* pFilePath){//序列化
      int fd = open(pFilePath,O_RDWR | O_CREAT | O_TRUNC, 0);//打开文件,若是文件不存在,就建立文件
      cout << "begin Serialize"<< endl;//给个提示
      if(fd == -1){//若是说打开文件或者建立文件错误,返回错误
          cout << "Serialize open error" << endl;
          return false;
      }
      if (write(fd,&i,sizeof(int)) == -1)//若是说向文件里面写入数据时出错,出错缘由有磁盘满,没有访问权限,超过了给定进程的文件长度等
      {
 	  cout << "Serialize write error" << endl;
          close(fd);//关闭文件
          return false;//返回错误
      }
      cout << "Serialize finish" << endl;
      return true;//若是上述打开与写都没有错误,那么则序列化成功
  }
  bool Deserialize(const char* pFilePath){//反序列化
      int fd = open(pFilePath,O_RDWR);//用读写的方式打开文件
      cout << "Deserialize begin" << endl;
      if (fd == -1)//打开文件错误
      {
          cout <<"Deserialize open error"<<endl;
          return false;//返回错误
      }
      int r = read(fd,&i,sizeof(char));//从序列化的文件读出数据
      if (r == -1)//读文件出错
      {
          cout << "Deserialize read error";
          close(fd);//关闭文件
          return false;//返回错误
      }
      if (close(fd) == -1){//若是关闭文件错误
	  cout << "Deserialize close error" << endl;
          return false;//返回错误
      }
      cout << "Deserialize finish" << endl;
      return true;//上述操做都成功,那么则反序列化成功
  }
};
int main(){//进行测试
    A a(12);//进行赋值
    a.Serialize("data.txt");//讲此文件序列化
    a.Deserialize("a.txt");//将此文件反序列化
    a.f();//代表序列化的数
}
相关文章
相关标签/搜索