热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

Introduction介绍序列化是将对象状态信息转换为可存储或传输的过程,序列化时,对象会将当前状态写入到临时或持久性的存储区。以后,可

Introduction

介绍

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

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

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

更多介绍

内容

  • 常见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

  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 BuffersBoostMFC
Serialization(ms)942191218
Unserialization(ms)2032961282
Archive Size(KB)459044935372

Conclusion

结论

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

推荐阅读
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 提升Python编程效率的十点建议
    本文介绍了提升Python编程效率的十点建议,包括不使用分号、选择合适的代码编辑器、遵循Python代码规范等。这些建议可以帮助开发者节省时间,提高编程效率。同时,还提供了相关参考链接供读者深入学习。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Python语法上的区别及注意事项
    本文介绍了Python2x和Python3x在语法上的区别,包括print语句的变化、除法运算结果的不同、raw_input函数的替代、class写法的变化等。同时还介绍了Python脚本的解释程序的指定方法,以及在不同版本的Python中如何执行脚本。对于想要学习Python的人来说,本文提供了一些注意事项和技巧。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • 3.223.28周学习总结中的贪心作业收获及困惑
    本文是对3.223.28周学习总结中的贪心作业进行总结,作者在解题过程中参考了他人的代码,但前提是要先理解题目并有解题思路。作者分享了自己在贪心作业中的收获,同时提到了一道让他困惑的题目,即input details部分引发的疑惑。 ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • 110. Balanced Binary Tree [Easy] 平衡树/递归
    本文介绍了一道关于平衡树的题目,通过递归和辅助函数来判断一个二叉树是否平衡。辅助函数返回根结点的深度,如果左子树或右子树不是平衡树,则返回-1。主函数根据辅助函数的返回值判断二叉树是否平衡。 ... [详细]
author-avatar
Aerotic
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有