將一個類的一個對象序列化到文件

序列化:將內存中的對象(數據)變成一個字節序。
反序列化:將字節序還原爲一個對象。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();//代表序列化的數
}
相關文章
相關標籤/搜索