最常用的两种C++序列化方案的使用心得(protobuf和boost serialization)
导读
-
什么是序列化?
-
为什么要序列化?好处在哪里?
-
C++对象序列化的四种方法
-
最常用的两种序列化方案使用心得
正文
- 什么是序列化?
程序员在编写应用程序的时候往往需要将程序的某些数据存储在内存中,然后将其写入某个文件或是将它传输到网络中的另一台计算机上以实现通讯。这个将 程序数据转化成能被存储并传输的格式的过程被称为“序列化”(Serialization),而它的逆过程则可被称为“反序列化” (Deserialization)。
简单来说,序列化就是将对象实例的状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它根据流重构对象。这两个过程结合起来,可以轻 松地存储和传输数据。例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象。
总结
序列化:将对象变成字节流的形式传出去。
反序列化:从字节流恢复成原来的对象。
- 为什么要序列化?好处在哪里?
简单来说,对象序列化通常用于两个目的:
(1) 将对象存储于硬盘上 ,便于以后反序列化使用
(2)在网络上传送对象的字节序列
对象序列化的好处在哪里?网络传输方面的便捷性、灵活性就不说了,这里举个我们经常可能发生的需求:你 有一个数据结构,里面存储的数据是经过很多其它数据通过非常复杂的算法生成的,由于数据量很大,算法又复杂,因此生成该数据结构所用数据的时间可能要很久 (也许几个小时,甚至几天),生成该数据结构后又要用作其它的计算,那么你在调试阶段,每次运行个程序,就光生成数据结构就要花上这么长的时间,无疑代价 是非常大的。如果你确定生成数据结构的算法不会变或不常变,那么就可以通过序列化技术生成数据结构数据存储到磁盘上,下次重新运行程序时只需要从磁盘上读 取该对象数据即可,所花费时间也就读一个文件的时间,可想而知是多么的快,节省了我们的开发时间。
- C++对象序列化的四种方法
将C++对象进行序列化的方法一般有四种,下面分别介绍:
3.1 Google Protocol Buffers(protobuf)
Google Protocol Buffers (GPB)是Google内部使用的数据编码方式,旨在用来代替XML进行数据交换。可用于数据序列化与反序列化。主要特性有:
高效
语言中立(Cpp, Java, Python)
可扩展
官方文档
3.2 Boost.Serialization
Boost.Serialization可以创建或重建程序中的等效结构,并保存为二进制数据、文本数据、XML或者有用户自定义的其他文件。该库具有以下吸引人的特性:
代码可移植(实现仅依赖于ANSI C++)。
深度指针保存与恢复。
可以序列化STL容器和其他常用模版库。
数据可移植。
非入侵性。
3.3 MFC Serialization
Windows平台下可使用MFC中的序列化方法。MFC 对 CObject 类中的序列化提供内置支持。因此,所有从 CObject 派生的类都可利用 CObject 的序列化协议。
MSDN中的介绍
3.4 .Net Framework
.NET的运行时环境用来支持用户定义类型的流化