• C++对象序列化简介与选型


    Introduction

    介绍

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

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

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

    更多介绍

    内容


    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 <afxwin.h>
        #include <afxtempl.h>
    2. 编写继承CObject方法的类
      • 实现序列化方法。
        void Serialize(CArchive& ar);
      • 添加序列化宏。
        //添加在声明类中
        DECLARE_SERIAL(basic_pojo_mfc)
        //...
        //添加在实现文件中
        IMPLEMENT_SERIAL(MyObject, CObject, 1)
    3. 编写序列化与反序列化的代码
      • 创建CFile,CArchive对象。
      • 写入对象,关闭资源。

    Google Protocol Buffers

    简介

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

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

    官方文档

    使用

    1. 下载GPB,并编译出需要使用的库。
    2. 编写.proto文件,并编译出.cc与.h文件。
      • 规则编写.proto
      • 编译:

        protoc -I=$SRC_DIR --cpp_out=$DST_DIR $SRC_DIR/addressbook.proto
    3. 编写序列化与反序列化代码

    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平台使用最为方便。
  • 相关阅读:
    告诉自己的十大忠告
    深度学习框架
    深度学习-Caffe编译测试的小总结
    深度学习-Windows平台下的Caffe编译教程
    C#中使用多款LevelDB.Net封装测试性能
    LevelDB初体验测试
    机器学习-分类器-Adaboost原理
    机器学习-分类器-级联分类器训练(Train CascadeClassifier )
    C# Directory.GetFiles()获取多个类型格式的文件
    部分Android或IOS手机拍照后照片被旋转的问题
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13318707.html
Copyright © 2020-2023  润新知