您的位置:首页 > 编程语言 > C语言/C++

C++对象序列化方案介绍

2014-11-19 16:29 330 查看

Introduction

介绍

序列化是将对象状态信息转换为可存储或传输的过程,序列化时,对象会将当前状态写入到临时或持久性的存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。

对象序列化反序列化通常用于:

将对象存储于硬盘上
在网络上传送对象的字节序列

更多介绍

内容

常见C++序列化方案

Boost.Serialization

MFC Serialization

Google Protocol Buffers

序列化方案比较与选型

测试用例
结果比较
结论

C++ Serialization Schemes

常见C++序列化方案 :介绍已有的C++序列化解决方案

Boost.Serialization

简介

Boost.Serialization可以创建或重建程序中的等效结构,并保存为二进制数据、文本数据、XML或者有用户自定义的其他文件。该库具有以下吸引人的特性:

代码可移植(实现仅依赖于ANSI C++)。
深度指针保存与恢复。
可以序列化STL容器和其他常用模版库。
数据可移植。
非入侵性。

使用

下载Boost库,并根据需要编译(Boost库涉及较广)。下载
编写自己的应用。

依需求编写入侵式或非入侵式序列化方法。
支持STL容器类、指针、父子类的序列化。

为需要序列化的类添加序列化代码。

初始化fstream。
依需求初始化xml, text, binary存档。
写入对象,并关闭文件流。

教程

MFC Serialization

简介

Windows平台下可使用MFC中的序列化方法。MFC 对 CObject 类中的序列化提供内置支持。因此,所有从 CObject 派生的类都可利用 CObject 的序列化协议。

MSDN中的介绍

使用

为VS项目添加MFC支持

设置项目属性。
包含头文件。
#include <afxwin.h>
#include <afxtempl.h>


编写继承CObject方法的类

实现序列化方法。
void Serialize(CArchive& ar);


添加序列化宏。
//添加在声明类中
DECLARE_SERIAL(basic_pojo_mfc)
//...
//添加在实现文件中
IMPLEMENT_SERIAL(MyObject, CObject, 1)


编写序列化与反序列化的代码

创建CFile,CArchive对象。
写入对象,关闭资源。

Google Protocol Buffers

简介

Google Protocol Buffers (GPB)是Google内部是用的数据编码方式,旨在用来代替XML进行数据交换。可用于数据序列化与反序列化。主要特性有:

高效
语言中立(Cpp, Java, Python)
可扩展

官方文档

使用

下载GPB,并编译出需要使用的库。
编写.proto文件,并编译出.cc与.h文件。

规则编写.proto
编译:

protoc -I=$SRC_DIR --cpp_out=$DST_DIR $SRC_DIR/addressbook.proto


编写序列化与反序列化代码

Comparison

序列化方案比较与选型

Test Case

测试用例介绍

比较维度

序列化与反序列化消耗时间
产生数据文件大小

测试数据类

//基本数据类型
class basic_pojo {
public :
char char8;
unsigned char uchar8;
short short16;
unsigned short ushort16;
int int32;
unsigned int uint32;
long long32;
unsigned long ulong32;
float float32;
double double64;
bool bool8;
};

//复合数据类型
class complex_pojo {
public :
string string_stl;
basic_pojo_boost basic_class;
};


测试代码

Results

比较结果

序列化与反序列化消耗时间





产生数据文件大小



数据:

Protocol BuffersBoostMFC
Serialization(ms)942191218
Unserialization(ms)2032961282
Archive Size(KB)459044935372

Conclusion

结论

Google Protocol Buffers效率较高,但是数据对象必须预先定义,并使用protoc编译,适合要求效率,允许自定义类型的内部场合使用。
Boost.Serialization 使用灵活简单,而且支持标准C++容器。
相比而言,MFC的效率较低,但是结合MSVS平台使用最为方便。

转自:https://code.google.com/p/plumgo/wiki/HSNNS_ObjectSerialization
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: