【原创】C++中对象的序列化

  1、对象序列化

    对象的序列化是指将对象的状态信息转换为可以存储或者传输的形式的过程。对象的反序列化是与序列化相反的过程。

    在序列化期间,对象将其当前的状态写入到临时或者永久性的存储区,可以通过从存储区读取或者反序列化对象的状态,重新创建该对象。

    通过序列化,可以将对象从一个应用域发送到另一个应用域中,或者通过网络连接将对象数据发送到另一台主机。

    博文中将对象序列化到文件中。

  2、C++下对象序列化的实现

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

      这是最简单的情况,一个类中只定义一个数据成员。

    

  1 //Srlz1.cpp: 将一个类的一个对象序列化到文件
  2 #include <iostream>
  3 #include <fcntl.h>
  4 #include <vector>
  5 #include <stdio.h>
  6 using namespace std;
  7
  8 //定义类CA
  9 //数据成员:int x;
 10 //成员函数:Serialize:进行序列化函数
 11 //             Deserialize反序列化函数
 12 //             Show:数据成员输出函数
 13 class CA
 14 {
 15     private:
 16         int x;  //定义一个类的数据成员。
 17
 18     public:
 19         CA()    //默认构造函数
 20         {
 21             x = 0;
 22         }
 23         CA(int y):x(y)    //定义构造函数,用初始化列表初始化数据成员
 24         {
 25         }
 26         virtual ~CA()    //析构函数
 27         {
 28         }
 29   public:
 30         //序列化函数:Serialize
 31         //成功,返回0,失败,返回0;
 32         int Serialize(const char* pFilePath) const
 33         {
 34             int isSrlzed = -1;
 35             FILE* fp;   //define a file pointer
 36             //以读写方式打开文件,并判断是否打开;
 37        if ((fp = fopen(pFilePath, "w+")) == NULL)
 38            {
 39                 printf("file opened failure\n");
 40                 return -1;  //若打开失败,则返回-1;
 41             }
 42             //调用fwrite函数,将对象写入文件;
 43        isSrlzed = fwrite(&x, sizeof(int), 1, fp);
 44
 45        //判断写入是否成功;
 46        if ((-1 == isSrlzed) || (0 == isSrlzed))
 47             {
 48                 printf("Serialize failure\n");
 49                 return -1;  //若写入失败,则返回-1;
 50             }
 51             if(fclose(fp) != 0) //关闭文件
 52             {
 53                 printf("Serialize file closed failure.\n");
 54                 return -1;
 55             }
 56             printf("Serialize succeed.\n");
 57             return 0;   //序列化成功,返回0;
 58         }
 59
 60         //反序列化函数:
 61         //成功,返回0,失败,返回-1;
 62         int Deserialize(const char* pFilePath)
 63         {
 64             int isDsrlzed = -1;
 65             FILE* fp;
 66             //以读写方式打开文件,并判断是否打开;
 67             if ((fp = fopen(pFilePath, "r+")) == NULL)
 68             {
 69                 printf("file opened failure.\n");
 70                 return -1;
 71             }
 72                //调用fread函数,读取文件中的对象 ;
 73        isDsrlzed = fread(&x, sizeof(int), 1, fp);
 74        //判断是否成功读入
 75             if ((-1 == isDsrlzed)||(0 == isDsrlzed))
 76             {
 77                 printf("Deserialize failure.\n");
 78                 return -1;    //若读取失败,则返回-1;
 79             }
 80             if(fclose(fp) != 0)
 81             {
 82                 printf("Deserialize file closed failure.\n");
 83                 return -1;
 84             }
 85             printf("Deserialize succeed.\n");
 86             return 0;        //反序列化成功,则返回0;
 87      }
 88
 89
 90         //成员对象输出显示函数
 91         void Show()
 92         {
 93             cout<< "in Show():"<< x << endl;
 94         }
 95 };

    以上代码定义了class CA,包括:

    数据成员:x;

    序列化函数:Serialize();

    反序列化函数:Derialize();

    数据成员输出函数:Show();

    main函数:

    

 1 int main(int argc, char const *argv[])
 2 {
 3   CA as(100);    //定义一个类对象,并初始化;
 4
 5     //调用序列化函数,将对象as序列化到文件data.txt中;
 6   as.Serialize("data.txt");
 7
 8   CA ad;        //定义一个类对象,用来记录反序列化对象
 9   //调用反序列化函数,将文件data.txt中的对象反序列化到ad对象;
10   ad.Deserialize("data.txt");
11
12   ad.Show();    //调用输出显示函数;
13
14   return 0;
15
16 }

   

时间: 2024-10-12 21:43:12

【原创】C++中对象的序列化的相关文章

为什么需要用到序列化?为什么HttpSession中对象要序列化

简单说就是为了保存在内存中的各种对象的状态,并且可以把保存的对象状态再读出来.虽然你可以用你自己的各种各样的方法来保存Object States,但是Java给你提供一种应该比你自己好的保存对象状态的机制,那就是序列化. 2.什么情况下需要序列化 a)当你想把的内存中的对象保存到一个文件中或者数据库中时候:b)当你想用套接字在网络上传送对象的时候:c)当你想通过RMI传输对象的时候: 3.当对一个对象实现序列化时,究竟发生了什么? 在没有序列化前,每个保存在堆(Heap)中的对象都有相应的状态(

asp.net中对象的序列化,方便网络传输

对象序列化 是将对象状态转换为可保持或传输的格式的过程.反序列化 是将流转换为对象序列化和反序列化相结合 可以使对象数据轻松的存储和传递 在 .NET 中,如果是对象可序列化,需要在 声明对象的开始部分加上 [Serializable] 这个属性,并且不能被继承如一个类 [Serializable]public class A{    public string title;} public class B : A{    public int total;} 则 对象B 不可被序列化 在 .N

java中对象的序列化和反序列化

[对象的序列化和反序列化 ] 1.定义:序列化--将对象写到一个输出流中.反序列化则是从一个输入流中读取一个对象.类中的成员必须是可序列化的,而且要实现Serializable接口,这样的类的对象才能被序列化和反序列化.这个接口是一个表示型的接口.serialVersionUID是一个串行化类的通用标示符,反串行化就是使用这个标示符确保一个加载的类对应一个可串行化的对象. 自己指定了serialVersionUID,就可以在序列化后,去添加一个字段,或者方法,而不会影响到后期的还原,还原后的对象

Android中两种序列化方式的比较Serializable和Parcelable

Serializable和Parcelable接口可以完成对象的序列化过程,当我们需要通过Intent和Binder传输数据时就需要使用者两种序列化方式.还有,我们需要对象持久化到存储设备或者通过网络传输给其他客户端,这个使用也需要使用Serializale来完成对象的序列化.在Android应用开发中,这两种方式都很常见,但两者方式并不相同. 1.Serializable接口 Serializable接口是Java提供的一个序列化接口,它是一个空接口,为对象提供标准的序列化和反序列化操作.使用

java中的对象的序列化与反序列化的知识点---IO学习笔记(四)

对象的序列化,反序列化 对象的序列化: 就是将Object转换成byte序列 对象的反序列化: 将byte序列转换成Object 序列化流,反序列化流 序列化流(ObjectOutputStream),是字节的过滤流->主要方法:writeObject() 反序列化流(ObjectInputStream)->主要方法:readObject() 序列化接口(Serializable) 对象必须实现序列化接口,才能进行序列化,否则将出现异常 这个接口,没有任何方法,只是一个标准. 基本的对象序列化

.net中对象序列化技术浅谈

.net中对象序列化技术浅谈 2009-03-11 阅读2756评论2 序列化是将对象状态转换为可保持或传输的格式的过程.与序列化相对的是反序列化,它将流转换为对象.这两个过程结合起来,可以轻松地存储和传输数 据.例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象.反之,反序列化根据流重新构造对象.此外还可以将对象序列化后保存到本地,再次运行的时候可以从本地文件 中“恢复”对象到序列化之前的状态.在.net中有提供了几种序列化的方式:二进制序列化

访问修饰限定符的简单总结、final/abstruct/interface对类的限制、自动加载机制、序列化与反序列化【数据持久化和对象的序列化问题】、对象的拷贝(按引用是因为对象标识)和克隆(__clone方法中的this指向)

1.针对访问修饰限定符的理解只需要两点:(1)针对的是类的概念和访问代码的位置来确定是否能够访问(2)对访问修饰限定符的使用时只需要对该成员的使用场景注意即可[也就是内部,继承类,外部进行访问的权限] 不需要对内部进行太多理解[需要对php底层理解时进行理解] [重点][用途]通过访问修饰限定符将内部成员的权限合理的限制,然后再使用公共接口来调用这个基本服务,保证外部不能访问其内部的构件[这样既能够通过类内的设置,将内部的功能实现更好的限制,只有最外层的接口可以正常被访问到,而不了解内部的业务]

Java中的强大武器——对象的序列化

所谓对象序列化就是将对象的状态转换成字节流,以后可以通过这些值再生成相同状态的对象.这个过程也可以通过网络实现,可以先在Windows机器上创建一个对象,对其序列化,然后通过网络发给一台Unix机器,然后在那里准确无误地重新“装配”.是不是很神奇. 也许你会说,只了解一点点,但从来没有接触过,其实未必如此.RMI.Socket.JMS.EJB你总该用过一种吧,彼此为什么能够传递Java对象,当然都是对象序列化机制的功劳. 第一次使用Java的对象序列化是做某项目,当时要求把几棵非常复杂的树(JT

Android中SharedPreferences和序列化结合保存对象数据

前言: 最近在做用户注册的时候,遇到了需要填写很多表单数据,不可能在一页把所有的数据都展示完全,因此采用了分页的方式,由于在用户填写数据数据之后我们需要对用户填写的数据进行暂时的记录的,当用户会到此页时,还能查看和修改.刚开始解决这个问题我们一定会从数据的大小的角度来解决,于是就有以下几种方式: A.运用临时静态变量static来保存到内存中                               B.运用SharedPreferences来保存