• C++对象序列化方案对比


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

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

    1. 将对象存储于硬盘上

    2. 在网络上传送对象的字节序列

    更多介绍

     

    常见的C++序列化方案

    ==Boost.Serialization==

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

    1. 代码可移植(实现仅依赖于ANSI C++)

    2. 深度指针保存与恢复

    3. 可以序列化STL容器和其他常用模版库

    4. 数据可移植

    5. 非入侵性

    使用教程

    下载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 BuffersBoost.SerializationMFC:SerializationSerialization(ms)942191218Unserialization(ms)2032961282Archive Size(KB)459044935372

     

    结论

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

  • 相关阅读:
    山东省第一届acm程序设计竞赛题解
    今日头条(3-30)第四题(离线)
    codeforces #204(div2)
    网易雷火笔试-打印机(区间dp)
    360笔试(3-18)编程题
    codeforces #202(div2) C
    RedisTemplate实现分布式锁
    redis的缓存穿透,缓存并发,缓存失效
    松哥整理了 15 道 Spring Boot 高频面试题,看完当面霸(转)
    我读过的最好的epoll讲解(nginx原理)--转自”知乎“
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13318761.html
Copyright © 2020-2023  润新知