`

C++对象序列化方案对比 (转)

 
阅读更多
转: http://hi.baidu.com/ewook/blog/item/add93b6da0d5e2e1431694e5.html
序列化是将对象状态信息转换为可存储或传输的过程,序列化时,对象会将当前状态写入到临时或持久性的存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。

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

1. 将对象存储于硬盘上

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

更多介绍



常见的C++序列化方案

==Boost.Serialization==

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

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

2. 深度指针保存与恢复

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

4. 数据可移植

5. 非入侵性

使用:教程http://www.boost.org/doc/libs/1_45_0/libs/serialization/doc/tutorial.html

下载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 Buffers Boost.Serialization MFC:Serialization
Serialization(ms)    94         219 1218
Unserialization(ms)  203         296 1282
Archive Size(KB)     4590         4493 5372





结论

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

相关推荐

    cpp-serializers:比较各种C ++数据序列化库(节俭,protobuf等)的基准

    3. **Cap'n Proto**:Cap'n Proto由Kenton Varda设计,其目标是提供比protobuf更快、更小的序列化方案。Cap'n Proto使用原生二进制格式,无需解析,因此在速度上具有显著优势。此外,它的零拷贝特性减少了内存操作,...

    面向对象技术课件、作业、答案-西安电子科技大学

    例如,使用Java或C++等面向对象语言,创建类和对象,实现继承和多态性。作业可能会涉及到设计和实现具有特定功能的系统,比如模拟银行系统、图形用户界面或者游戏引擎等,这些项目有助于锻炼学生的实际编程能力和...

    俄罗斯方块(C++编写)

    通过分析这些文件,我们可以看到C++如何进行文件操作,以及如何将游戏状态序列化和反序列化。 5. **版本控制** 文件名中的"V1.3"和"V1.1"表示版本号,这表明开发者对游戏进行了多次迭代和改进。通过对比不同版本的...

    Starting out with C++ early objects

    《从零开始学C++:早期对象》是学习C++编程语言的一本经典教材,它不仅为初学者提供了深入浅出的理论知识,还通过大量的实践案例帮助读者掌握C++的核心概念和技术。以下是对该书各章节关键知识点的详细解析: ### ...

    protocol buffers 官网中文教程

    "Google Protocol Buffers简析.pdf"可能是对Protocol Buffers的深入解析,涵盖了高级用法、性能优化、与其他序列化方案的对比等内容。"protocolbufcn.rar"可能包含了中文版的Protocol Buffers文档、示例代码或其他...

    c++车牌识别

    1. **C++编程**:C++是一种强大的面向对象的编程语言,它提供了丰富的库支持和高效的执行性能,适合处理复杂的计算任务,如图像处理和机器学习算法。 2. **OpenCV库**:OpenCV(开源计算机视觉库)是一个广泛使用的...

    flatbuffers,平面缓冲器.zip

    通过研究源码,开发者可以深入了解其内部实现,定制自己的序列化解决方案,或者为项目贡献代码。 总的来说,FlatBuffers是一种强大的序列化工具,它通过优化内存布局和访问方式,提供了高效的序列化和反序列化体验...

    编写高质量代码之C#、C++_nodrm.azw3

    《编写高质量代码:改善c#程序的157个建议》一共三个部分,第一部分专注于c#语言本身,一共89条建议,涵盖了c#语言基本要素、集合、linq、泛型、委托、事件、资源管理、序列化、异常处理、异步、多线程、任务和并行...

    C++课程设计 通信录管理系统

    这涉及到文件I/O操作,如fstream库的使用,以及数据序列化和反序列化的技巧。 3. 用户界面:设计用户友好的交互界面,可以是命令行界面(CLI)或者图形用户界面(GUI)。对于CLI,可以使用标准输入输出进行交互;...

    Unity项目热更新方案性能分析总结.

    当前,Unity的热更新方案大多依赖于第三方框架,包括但不限于IL2CPP的使用、脚本语言的更换、资源的序列化以及资源与代码的绑定策略等。IL2CPP(Intermediate Language To C++)是Unity用来转换中间语言IL代码到C++...

    hessian-4.0.7.jar + src

    2. **简单**:Hessian协议简单易用,可以自动处理Java对象的序列化和反序列化,降低了开发难度。 3. **跨平台**:虽然主要针对Java,但Hessian也有其他语言的实现,如C++、Python等,实现了跨语言的通信。 4. **透明...

    面向对象的分析与设计 1~4章

    在这一讲中,可能会对比不同的面向对象语言,如Java、C++、Python等,探讨它们如何实现面向对象特性,并解释各种语言在面向对象设计中的优势和局限性。此外,还可能讨论一些设计模式,如工厂模式、单例模式等,这些...

    Genivia gSOAP Documentation

    - **从 XML 反序列化 C/C++ 数据**:介绍了如何从 XML 反序列化回 C/C++ 数据。 - **序列化和反序列化类实例**:详细说明了如何序列化和反序列化类实例。 通过本文档的学习,开发者可以全面掌握 gSOAP 的使用方法...

    jsoncpp使用测试

    - **序列化和反序列化**:将C++对象转换为JSON格式存储,或者从JSON数据恢复C++对象。 - **数据交互**:与服务器进行JSON格式的数据交换,如API调用。 - **配置文件读写**:使用JSON格式作为配置文件,方便读写和...

    Hadoop源码分析(完整版)

    Hadoop并没有使用Java的序列化机制,而是自己定义了大量的可序列化对象,这些对象都实现了Writable接口。实现Writable接口的类可以将对象数据编码成适合网络传输的格式,并能够从这种格式中解码。 Hadoop的...

    2022年python面试常见的25个问题.docx

    Python的序列化机制称为pickle和unpickle,pickle模块可以将Python对象转化为字符串并保存到文件中,unpickle则负责反序列化,恢复原始对象。 Python的内存管理由私有的heap空间处理,解释器负责分配和回收内存。...

    algorithms in C++

    根据提供的文件信息,我们可以从《C++中的算法》这本书中提炼出多个重要的知识点。下面将对这些知识点进行详细的介绍和解释。 ### 一、算法基础知识 #### 1.1 算法概述 - **定义**:算法是解决特定问题的一系列...

    ROXS-开源

    4. **简单对象序列化**:ROXS提供了内置的序列化机制,能够将C++对象转换为网络传输的字节流,并在接收端还原。这种序列化机制既高效又易于使用,有助于简化数据交换的过程。 **二、ROXS与RMI和CORBA的对比** 1. *...

Global site tag (gtag.js) - Google Analytics