将一个类的一个对象序列化到文件
序列化:将内存中的对象(数据)变成一个字节序。
反序列化:将字节序还原为一个对象。
那么这个只需要此对象写入文件,然后完成序列化;
反序列化就是将此对象的序列化重新反序列化
/**
序列化:将内存中的对象(数据)变成一个字节序。
反序列化:将字节序还原为一个对象。
*/
#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();//表明序列化的数
}

浙公网安备 33010602011771号