转:
http://hi.baidu.com/ewook/blog/item/add93b6da0d5e2e1431694e5.html
序列化是将对象状态信息转换为可存储或传输的过程,序列化时,对象会将当前状态写入到临时或持久性的存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。
对象序列化反序列化通常用于:
1. 将对象存储于硬盘上
2. 在网络上传送对象的字节序列
更多介绍
常见的C++序列化方案
==Boost.Serialization==
介绍:Boost.Serialization可以创建或重建程序中的等效结构,并保存为二进制数据、文本数据、XML或者有用户自定义的其他文件。该库具有以下吸引人的特性:
1. 代码可移植(实现仅依赖于ANSI C++)
2. 深度指针保存与恢复
3. 可以序列化STL容器和其他常用模版库
4. 数据可移植
5. 非入侵性
使用:教程
http://www.boost.org/doc/libs/1_45_0/libs/serialization/doc/tutorial.html
下载Boost库,并根据需要编译(Boost库涉及较广)。
编写应用。
●依需求编写入侵式或非入侵式序列化方法
●支持STL容器类、指针、父子类的序列化
为需要序列化的类添加序列化代码。
●初始化fstream
●需求初始化xml, text, binary存档
●写入对象,并关闭文件流
== MFC Serialization ==
简介:Windows平台下可使用MFC中的序列化方法。MFC 对 CObject 类中的序列化提供内置支持。因此,所有从 CObject 派生的类都可利用 CObject 的序列化协议。(MSDN中的介绍)
使用:
为VS项目添加MFC支持
●设置项目属性
●包含头文件C++:
1 #include <afxwin.h>
2 #include <afxtempl.h>
●编写继承CObject的类
●实现序列化方法C++:
1 void Serialize(CArchive& ar);
●添加序列化宏C++:
1 //添加在声明类中
2 DECLARE_SERIAL(basic_pojo_mfc)
3 //…
4 //添加在实现文件中
5 IMPLEMENT_SERIAL(MyObject, CObject, 1)
●编写序列化与反序列化的对象
●创建CFile,CArchive对象
●写入对象,关闭资源
==Google Protocol Buffers==
简介:Google Protocol Buffers (GPB)是Google内部是用的数据编码方式,旨在用来代替XML进行数据交换。可用于数据序列化与反序列化。主要特性有:
1. 高效
2. 语言中立(Cpp, Java, Python)
3. 可扩展
官方文档
使用:
●下载GPB,并编译出需要使用的库。
●编写.proto文件,并编译出.cc与.h文件。
●依规则编写.proto
●编译
●Shell/CMD:
1 protoc -I=$SRC_DIR –cpp_out=$DST_DIR $SRC_DIR/addressbook.proto
●编写序列化与反序列化代码。
比较
==测试用例介绍==
比较维度:
●序列化与反序列化消耗的时间
●产生数据文件大小
测试数据类型:
C++:01 //基本数据类型
02 class basic_pojo {
03 public :
04 char char8;
05 unsigned char uchar8;
06 short short16;
07 unsigned short ushort16;
08 int int32;
09 unsigned int uint32;
10 long long32;
11 unsigned long ulong32;
12 float float32;
13 double double64;
14 bool bool8;
15 };
16
17 //复合数据类型
18 class complex_pojo {
19 public :
20 string string_stl;
21 basic_pojo_boost basic_class;
22 };
测试代码
结果
序列化与反序列化消耗的时间:
产生数据文件大小:
数据:
|
Protocol Buffers |
Boost.Serialization |
MFC:Serialization |
Serialization(ms) |
94 |
219 |
1218 |
Unserialization(ms) |
203 |
296 |
1282 |
Archive Size(KB) |
4590 |
4493 |
5372 |
结论
Google Protocol Buffers效率较高,但是数据对象必须预先定义,并使用protoc编译,适合要求效率,允许自定义类型的内部场合使用。Boost.Serialization 使用灵活简单,而且支持标准C++容器。相比而言,MFC的效率较低,但是结合MSVS平台使用最为方便。希望有时间补充更多的序列化方案及测试指标。