当前位置:C++技术网 > 精选软件 > C++轻松实现对象序列化和反序列化

C++轻松实现对象序列化和反序列化

更新时间:2017-04-09 01:02:16浏览次数:1+次

    可能你还没有接触过对象序列化和反序列化,那么我先解释一下这个概念。
    所谓对象序列化,实际上就是将内存中运行的对象直接存入磁盘。对象在内存中是二进制的数据,是一个可以直接执行的实体,而不需要再经过构造之类的流程了。因为我们存储的对象就是已经构造好的对象。而反序列化就是要将存储在磁盘的对象的二进制数据读入内存,并将数据直接转化为对象,并可以用对象来执行功能。
    而序列化的好处就是要将内存中运行的内存永久存储在磁盘里,需要的话,磁盘的对象数据一旦调入内存就可以立即开始工作。这个机制和Windows的系统休眠差不多。实际上Windows的休眠机制也差不多是这样实现的。我们只是类比工作原理,Windows休眠是将CPU、内存的所有相关的信息都存盘了,下次系统启动的时候,直接将这些数据还原到对应的位置,直接就可以开始工作了。这样也就不需要再一步步的初始化了,可以迅速进入之间的工作状态。我们的对象序列化也是如此。
    因为C/C++的强制类型转换太厉害了。数据和指令界限太模糊了,只要一个强制转换,数据可以成为指令执行(反序列化),指令也可以变成数据存储(对象序列化)。我们这里说的对象,不仅仅是类对象,还可以是结构体、变量各种内存中运行的东西。
    那么我们下面来看看C++如何将一个对象序列化存储到文件里,然后又是如何反序列化将对象又运行起来的?
    基本思路:先定义一个类,类中有一个int变量,一个test函数可以打印int变量。在构造对象A的时候,传入一个初始的值100,调用test函数就可以打印出来了。我们第一次将一个对象初始化后,存入文件。第二次读取文件,初始化一个类对象B,然后我们再读取文件,将文件数据直接存入新建的对象B的内存中。因为对象的内存大小是固定的,所以不会有内存越界问题。然后我们再调用类对象B的test函数,看看结果如何?
    下面是代码:
#include "stdio.h"
class T
{
public:
 int m_i;
 T(int i)
 {
 m_i=i;
 }
 void test()
 {
 printf("%d",m_i);
 }
};

void main()
{
 T t(100);
 FILE *fp;
 fp=fopen("obj.dat","w+");
 fwrite(&t,sizeof(T),1,fp);
 fclose(fp);

 T t2(0);
 FILE *fp2;
 fp2=fopen("obj.dat","r");
 fread(&t2,sizeof(T),1,fp);
 fclose(fp);
 t2.test();
}
    你可以运行一下看看效果,结果你会发现,t2打印出来的确实是之前文件中存储的对象的数据哦。这样也就实现了对象的序列化和反序列化。听起来高大上的技术,实则也可以这么轻松的实现,是不是很神奇。
    只不过我们需要注意的是,我们在反序列化的时候,我们需要确保我们有正确的类型。如果我们反序列化的地方没有定义对象的类类型,反序列化将无法实现。我们这里借助了一个临时的对象来实现反序列化。其实在一般的应用场景中,这样就够了。当然这样的实现方法,功能并不会太强大,Boost、MFC、.Net等都有实现序列化和反序列化,他们实现的方式就非常强大了。不过使用和理解起来会麻烦些,我们这样的实现是相当好理解的,用起来也简单,比较实用,就分享一下。