Export to GitHub

plumgo - HSNNS_ObjectSerialization.wiki


Introduction

介绍

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

对象序列化反序列化通常用于: 1. 将对象存储于硬盘上 1. 在网络上传送对象的字节序列

更多介绍

内容

  • 常见C++序列化方案
    • Boost.Serialization
    • MFC Serialization
    • Google Protocol Buffers
  • 序列化方案比较与选型
    • 测试用例
    • 结果比较
    • 结论

C++ Serialization Schemes

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

Boost.Serialization

简介

Boost.Serialization可以创建或重建程序中的等效结构,并保存为二进制数据、文本数据、XML或者有用户自定义的其他文件。该库具有以下吸引人的特性: * 代码可移植(实现仅依赖于ANSI C++)。 * 深度指针保存与恢复。 * 可以序列化STL容器和其他常用模版库。 * 数据可移植。 * 非入侵性。

使用

  1. 下载Boost库,并根据需要编译(Boost库涉及较广)。下载
  2. 编写自己的应用。
    • 依需求编写入侵式或非入侵式序列化方法。
    • 支持STL容器类、指针、父子类的序列化。
  3. 为需要序列化的类添加序列化代码。
    • 初始化fstream。
    • 依需求初始化xml, text, binary存档。
    • 写入对象,并关闭文件流。

教程

MFC Serialization

简介

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

MSDN中的介绍

使用

  1. 为VS项目添加MFC支持
    • 设置项目属性。
    • 包含头文件。 ```

      include

include

1. 编写继承CObject方法的类 * 实现序列化方法。 void Serialize(CArchive& ar); * 添加序列化宏。 //添加在声明类中 DECLARE_SERIAL(basic_pojo_mfc) //... //添加在实现文件中 IMPLEMENT_SERIAL(MyObject, CObject, 1) ``` 1. 编写序列化与反序列化的代码 * 创建CFile,CArchive对象。 * 写入对象,关闭资源。

Google Protocol Buffers

简介

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

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

官方文档

使用 1. 下载GPB,并编译出需要使用的库。 1. 编写.proto文件,并编译出.cc与.h文件。 * 依规则编写.proto * 编译: protoc -I=$SRC_DIR --cpp_out=$DST_DIR $SRC_DIR/addressbook.proto 1. 编写序列化与反序列化代码


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

比较结果

  • 序列化与反序列化消耗时间 http://storage.live.com/items/9E87992F08CD005F!4050?filename=serialize01.jpg http://storage.live.com/items/9E87992F08CD005F!4051?filename=serialize02.jpg
  • 产生数据文件大小 http://storage.live.com/items/9E87992F08CD005F!4052?filename=serialize03.jpg
  • 数据: | | 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平台使用最为方便。