C++对象序列化简介与选型
2013-10-13 20:59
302 查看
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 Buffers | Boost | MFC | |
Serialization(ms) | 94 | 219 | 1218 |
Unserialization(ms) | 203 | 296 | 1282 |
Archive Size(KB) | 4590 | 4493 | 5372 |
Conclusion
结论Google Protocol Buffers效率较高,但是数据对象必须预先定义,并使用protoc编译,适合要求效率,允许自定义类型的内部场合使用。
Boost.Serialization 使用灵活简单,而且支持标准C++容器。
相比而言,MFC的效率较低,但是结合MSVS平台使用最为方便。
相关文章推荐
- C++对象序列化简介与选型
- C++对象序列化简介与选型
- C++对象序列化简介与选型
- 使用C++进行对象序列化
- C++对象序列化
- c++ java中关于protobuf反序列化对象实体和实体处理(函数)关系 (一)
- C++对象序列化方案介绍
- C++对象序列化方案对比
- 使用 acl 库针对 C++ 对象进行序列化及反序列编程
- c++几个概念简介(结构体模版与函数对象)
- java与c++中的对象序列化分析
- Java 流(Stream)简介:3、对象序列化
- java与c++中的对象序列化 分析。
- C++基本功之 对象序列化
- c++对象的序列化与反序列化的解决方案----flatbuffers的使用
- c++==简介及面向对象特点(1)
- C++对象序列化方案对比
- C++对象序列化方案对比
- C++ / QT 对象序列化(Object Serialization)的实现
- C++对象模型简介(一)——《深度探索C++对象模型》精简笔记