C++序列化
来源:互联网 发布:linux操作vasp计算 编辑:程序博客网 时间:2024/06/14 22:21
一、序列化
在编写应用程序的时候往往需要将程序的某些数据存储在内存中,然后将其写入某个文件或是将它传输到网络中的另一台计算机上以实现通讯。这个将 程序数据转化成能被存储并传输的格式的过程被称为“序列化”(Serialization),而它的逆过程则可被称为“反序列化” (Deserialization)。
简单来说,序列化就是将对象实例的状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它根据流重构对象。这两个过程结合起来,可以轻 松地存储和传输数据。例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象。
序列化:将对象变成字节流的形式传出去。
反序列化:从字节流恢复成原来的对象。
简单来说,对象序列化通常用于两个目的:
1)将对象存储于硬盘上 ,便于以后反序列化使用。
2)在网络上传送对象的字节序列。
在编写应用程序的时候往往需要将程序的某些数据存储在内存中,然后将其写入某个文件或是将它传输到网络中的另一台计算机上以实现通讯。这个将 程序数据转化成能被存储并传输的格式的过程被称为“序列化”(Serialization),而它的逆过程则可被称为“反序列化” (Deserialization)。
简单来说,序列化就是将对象实例的状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它根据流重构对象。这两个过程结合起来,可以轻 松地存储和传输数据。例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象。
序列化:将对象变成字节流的形式传出去。
反序列化:从字节流恢复成原来的对象。
简单来说,对象序列化通常用于两个目的:
1)将对象存储于硬盘上 ,便于以后反序列化使用。
2)在网络上传送对象的字节序列。
二、C++对象序列化方法
1、Boost.Serialization
Boost.Serialization可以创建或重建程序中的等效结构,并保存为二进制数据、文本数据、XML或者有用户自定义的其他文件。该库具有以下吸引人的特性:
1). 代码可移植(实现仅依赖于ANSI C++)
2). 深度指针保存与恢复
3). 可以序列化STL容器和其他常用模版库
4). 数据可移植
5). 非入侵性
boost::serialization 基于 boost::archive 来完成任意复杂数据结构的序列化,boost::archive提供两个实现类来完成序列化、反序列化操作:
boost::archive::text_oarchive 序列化数据,也称为:输出、保存(save)
boost::archive::text_iarchive 反序列化数据,也称为:输入、载入(load)
也可以使用二进制格式:binary_oarchive, binary_iarchive
&操作符
序列化操作使用 << 或者 & 操作符将数据存入text_oarchive中:
ar << data;
ar & data;
反序列化操作使用 >> 或者 & 操作符从text_iarchive中读取数据:
ar >> data;
ar & data;
为什么要引入&操作符?很简单,&操作符可以同时用于序列化和反序列化操作,这样就只需要提供一个 serialize 模板函数就可以同时用于两种操作,具体执行哪种由ar的类型(模版参数类型)决定;如果ar是text_oarchive类型则是序列化,如果ar是text_iarchive类型则是反序列化。
1、Boost.Serialization
Boost.Serialization可以创建或重建程序中的等效结构,并保存为二进制数据、文本数据、XML或者有用户自定义的其他文件。该库具有以下吸引人的特性:
1). 代码可移植(实现仅依赖于ANSI C++)
2). 深度指针保存与恢复
3). 可以序列化STL容器和其他常用模版库
4). 数据可移植
5). 非入侵性
boost::serialization 基于 boost::archive 来完成任意复杂数据结构的序列化,boost::archive提供两个实现类来完成序列化、反序列化操作:
boost::archive::text_oarchive 序列化数据,也称为:输出、保存(save)
boost::archive::text_iarchive 反序列化数据,也称为:输入、载入(load)
也可以使用二进制格式:binary_oarchive, binary_iarchive
&操作符
序列化操作使用 << 或者 & 操作符将数据存入text_oarchive中:
ar << data;
ar & data;
反序列化操作使用 >> 或者 & 操作符从text_iarchive中读取数据:
ar >> data;
ar & data;
为什么要引入&操作符?很简单,&操作符可以同时用于序列化和反序列化操作,这样就只需要提供一个 serialize 模板函数就可以同时用于两种操作,具体执行哪种由ar的类型(模版参数类型)决定;如果ar是text_oarchive类型则是序列化,如果ar是text_iarchive类型则是反序列化。
2、protobuf
Google Protocol Buffers (GPB)是Google内部是用的数据编码方式,旨在用来代替XML进行数据交换。可用于数据序列化与反序列化。主要特性有:
1). 高效
2). 语言中立(Cpp, Java, Python)
3). 可扩展
官网地址:http://code.google.com/p/protobuf/
3、MFC Serialization
Windows平台下可使用MFC中的序列化方法。MFC 对 CObject 类中的序列化提供内置支持。因此,所有从 CObject 派生的类都可利用 CObject 的序列化协议。
继承CObject的类,实现序列化方法Serialize(CArchive& ar),添加序列化宏DECLARE_SERIAL。编写序列化与反序列化的对象。
几种方法对比:
Google Protocol Buffers效率较高,但是数据对象必须预先定义,并使用protoc编译,适合要求效率,允许自定义类型的内部场合使用。Boost.Serialization 使用灵活简单,而且支持标准C++容器。相比而言,MFC的效率较低,但是结合VisualStdio平台使用最为方便。
参考资料
http://www.cnblogs.com/lanxuezaipiao/p/3703988.html
http://blog.csdn.net/liyongofdm/article/details/7650380
Google Protocol Buffers (GPB)是Google内部是用的数据编码方式,旨在用来代替XML进行数据交换。可用于数据序列化与反序列化。主要特性有:
1). 高效
2). 语言中立(Cpp, Java, Python)
3). 可扩展
官网地址:http://code.google.com/p/protobuf/
3、MFC Serialization
Windows平台下可使用MFC中的序列化方法。MFC 对 CObject 类中的序列化提供内置支持。因此,所有从 CObject 派生的类都可利用 CObject 的序列化协议。
继承CObject的类,实现序列化方法Serialize(CArchive& ar),添加序列化宏DECLARE_SERIAL。编写序列化与反序列化的对象。
几种方法对比:
Google Protocol Buffers效率较高,但是数据对象必须预先定义,并使用protoc编译,适合要求效率,允许自定义类型的内部场合使用。Boost.Serialization 使用灵活简单,而且支持标准C++容器。相比而言,MFC的效率较低,但是结合VisualStdio平台使用最为方便。
参考资料
http://www.cnblogs.com/lanxuezaipiao/p/3703988.html
http://blog.csdn.net/liyongofdm/article/details/7650380
阅读全文
0 0
- 【C#】XML序列化
- C++/C#序列化
- 序列化(java+C++)
- C#_序列化
- C#: 序列化技术示例
- 【c】序列化图片资源
- c#~简单序列化操作
- objective-c归档,序列化
- c#.net实体类序列化方法 为什么序列化
- Objective-C 序列化/反序列化
- "序列化" Serializable 理解 (asp.net C#)
- C#***类、序列化、函数……
- "序列化" Serializable 理解 (asp.net C#)
- [C#]BinaryFormatter、SoapFormatter、XML3种序列化
- c#.net实体类序列化方法
- 序列化Serializable(asp.net C#)
- C 语言的数据序列化
- C#-二进制和XML序列化
- Dijkstra模板[kuangbin]
- 程序员要知道的移位技巧
- 浅谈http返回码
- 微信开发怎么被动发送图文消息用户输入信息之后回复
- 在openStark框架中能用taskctl吗
- C++序列化
- intel caffe出现undefined symbol: mkl_sparse_d_csr__g_n_syrk_notr_row_struct_i8
- centos 优化 (内存等等)
- Docker部署基于Nodejs的Web应用-实战篇
- nfs搭建
- ffmpeg3.3新版本AVStream的封装流参数由codec替换codecpar(解码)
- redis配置详解说明
- 面向对象的知识点,为何面向对象设计?好处,三大特征
- 算法入门——快速排序