`

C++对象序列化方案对比 (转)

 
阅读更多
转: 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平台使用最为方便。希望有时间补充更多的序列化方案及测试指标。
分享到:
评论

相关推荐

    Hprose与.NET中各种序列化方式的对比

    本文主要在.NET平台上对比Hprose与.NET平台中提供的各种序列化方式的比较,序列化并不是Hprose的全部,但它是Hprose的核心部分之一,通过对序列化的比较,我们就可以对Hprose的性能有一个大概的了解了。 Hprose提供...

    编写高质量代码之C#、C++_nodrm.azw3

    《编写高质量代码:改善c#程序的157个建议》一共三个部分,第一部分专注于c#语言本身,一共89条建议,涵盖了c#语言基本要素、集合、linq、泛型、委托、事件、资源管理、序列化、异常处理、异步、多线程、任务和并行...

    Think in Java(中文版)chm格式

    12.2.8 通过序列化进行深层复制 12.2.9 使克隆具有更大的深度 12.2.10 为什么有这个奇怪的设计 12.3 克隆的控制 12.3.1 副本构建器 12.4 只读类 12.4.1 创建只读类 12.4.2 “一成不变”的弊端 12.4.3 不变...

    Java初学者入门教学

    12.2.8 通过序列化进行深层复制 12.2.9 使克隆具有更大的深度 12.2.10 为什么有这个奇怪的设计 12.3 克隆的控制 12.3.1 副本构建器 12.4 只读类 12.4.1 创建只读类 12.4.2 “一成不变”的弊端 12.4.3 不变字串 ...

    JAVA_Thinking in Java

    12.2.8 通过序列化进行深层复制 12.2.9 使克隆具有更大的深度 12.2.10 为什么有这个奇怪的设计 12.3 克隆的控制 12.3.1 副本构建器 12.4 只读类 12.4.1 创建只读类 12.4.2 “一成不变”的弊端 12.4.3 不变字串 ...

    ThinkInJava

    12.2.8 通过序列化进行深层复制 12.2.9 使克隆具有更大的深度 12.2.10 为什么有这个奇怪的设计 12.3 克隆的控制 12.3.1 副本构建器 12.4 只读类 12.4.1 创建只读类 12.4.2 “一成不变”的弊端 12.4.3 不变字串 ...

    java 编程入门思考

    12.2.8 通过序列化进行深层复制 12.2.9 使克隆具有更大的深度 12.2.10 为什么有这个奇怪的设计 12.3 克隆的控制 12.3.1 副本构建器 12.4 只读类 12.4.1 创建只读类 12.4.2 “一成不变”的弊端 12.4.3 不变字串 ...

    thinkinjava

    12.2.8 通过序列化进行深层复制 12.2.9 使克隆具有更大的深度 12.2.10 为什么有这个奇怪的设计 12.3 克隆的控制 12.3.1 副本构建器 12.4 只读类 12.4.1 创建只读类 12.4.2 “一成不变”的弊端 12.4.3 不变字串 ...

    Thinking in Java 中文第四版+习题答案

    12.2.8 通过序列化进行深层复制 12.2.9 使克隆具有更大的深度 12.2.10 为什么有这个奇怪的设计 12.3 克隆的控制 12.3.1 副本构建器 12.4 只读类 12.4.1 创建只读类 12.4.2 “一成不变”的弊端 12.4.3 不变字串 ...

    Thinking in Java简体中文(全)

    12.2.8 通过序列化进行深层复制 12.2.9 使克隆具有更大的深度 12.2.10 为什么有这个奇怪的设计 12.3 克隆的控制 12.3.1 副本构建器 12.4 只读类 12.4.1 创建只读类 12.4.2 “一成不变”的弊端 12.4.3 不变字串 ...

    java联想(中文)

    12.2.8 通过序列化进行深层复制 12.2.9 使克隆具有更大的深度 12.2.10 为什么有这个奇怪的设计 12.3 克隆的控制 12.3.1 副本构建器 12.4 只读类 12.4.1 创建只读类 12.4.2 “一成不变”的弊端 12.4.3 不变字串 ...

    JAVA_Thinking in Java(中文版 由yyc,spirit整理).chm

    12.2.8 通过序列化进行深层复制 12.2.9 使克隆具有更大的深度 12.2.10 为什么有这个奇怪的设计 12.3 克隆的控制 12.3.1 副本构建器 12.4 只读类 12.4.1 创建只读类 12.4.2 “一成不变”的弊端 12.4.3 不变字串 ...

    Thinking in Java(中文版 由yyc,spirit整理).chm

    12.2.8 通过序列化进行深层复制 12.2.9 使克隆具有更大的深度 12.2.10 为什么有这个奇怪的设计 12.3 克隆的控制 12.3.1 副本构建器 12.4 只读类 12.4.1 创建只读类 12.4.2 “一成不变”的弊端 12.4.3 不变字串 ...

    操作系统(内存管理)

    在大部分系统语言中,比如 C 和 C++,您必须进行内存管理。本文将介绍手工的、半手工的以及自动的内存管理实践的基本概念。 追溯到在 Apple II 上进行汇编语言编程的时代,那时内存管理还不是个大问题。您实际上在...

    内存管理内存管理内存管理

    malloc 初始化代码,它将找到当前中断点并初始化我们的变量: 清单 2. 分配程序初始化函数 /* Include the sbrk function */ #include void malloc_init() { /* grab the last valid address from the OS *...

Global site tag (gtag.js) - Google Analytics