1.什么是序列化和反序列化?
当我们在编写一个应用程序的时候,我们需要将程序的数据保存在内存中,可能将他保存在一个文件中或者是放在另一台电脑上作为通讯传输,这种数据转化为专门用于储存和传输格式的过程就成为序列化。反之“反序列化”。
2.为什么要用序列化,序列化的有优点?
当我们的程序在非常庞大,产生数据的过程需要很久(几个小时,几天),产生的数据又要进行其他算法用途。这个时候当我们产生的数据不变时,我们可以将产生的数据按一个规格储存在一个硬盘里面,下次用的时候。可以直接在硬盘里面进行读取数据。这样就节省了我们产生数据的时间。提高了效率。
3.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 的序列化协议。
3.4 .Net Framework
.NET的执行时环境用来支持用户定义类型的流化的机制。它在此过程中,先将对象的公共字段和私有字段以及类的名称(包含类所在的程序集)转换为字节流,然后再把字节流写入数据流。在随后对对象进行反序列化时,将创建出与原对象全然同样的副本。
4.总结
这几种序列化方案各有优缺点,各有自己的适用场景。当中MFC和.Net框架的方法适用范围非常窄,仅仅适用于Windows下,且.Net框架方法还须要.Net的执行环境。參考文献1从序列化时间、反序列化时间和产生数据文件大小这几个方面比較了前三种序列化方案,得出结论例如以下(仅供參考):
①Googel protocol Buffers效率较高,可是数据对象预先定义,并使用protoc编译,适合要求效率,同意自己定义类型的内部场合使用。
②Boost.Serialzetion使用灵活简单,并且支持标准C++容器
③相比而言,MFC的效率较低,可是结合MSVS平台使用最为方便。
为了考虑平台的移植性、适用性和高效性,推荐大家使用Google的protobuf和Boost的序列化方案,以下介绍我使用这两种方案的心得及注意事项。