一个更好的C++序列化/反序列化库Kapok

简介:

1.Kapok的特点

简单,易用,header-only,只需要引用Kapok.hpp即可;高效,初步测试性和messagepack相当。

它是纯c++11实现,因此需要支持C++11的编译器。

2.主要功能

对对象进行自动化的序列化和反序列化,用起来非常简单,先来看个序列化/反序列化一个tuple的例子吧。


 
 
  1. //序列化 
  2. Serializer sr; 
  3. auto tp = std::make_tuple(1012, string("test")); 
  4. sr.Serialize(tp, "tuple"); 
  5.  
  6. //反序列化 
  7. DeSerializer dr; 
  8. std::tuple<intint, string> p; 
  9. dr.Parse(sr.GetString()); 
  10. dr.Deserialize(p, "tuple"); 

看起来是不是很简单!

再看一个序列化一个自定义对象的例子。


 
 
  1. struct Person 
  2. int age; 
  3. string name; 
  4. string city; 
  5.   
  6. META(age, name, city) 
  7. }; 
  8.   
  9. Person p = { 18"bb""aa" }; 
  10. //序列化 
  11. Serializer sr; 
  12. sr.Serialize(p, "Person"); 
  13.   
  14. //反序列化 
  15. DeSerializer dr; 
  16. Person person; 
  17. dr.Parse(sr.GetString()); 
  18. dr.Deserialize(person, "Person"); 

一样的很简单,结构这里需要一个宏定义META,这个META的作用就是获取对象的元信息,有了这个元信息我们就可以很方便的实现序列化和反序列化了。

3.应用场景

Kapok除了不支持指针之外所有的对象都支持,支持结构体的无限嵌套(被嵌套的结构体也必须定义META宏)。这里说一下为 什么不支持指针呢,因为对象中有指针的话存在两个问题:1.这个指针如果是动态数组的话,c++中无法获取这个数组的长度;2.指针还涉及到内存管理,我 希望Kapok专注于序列化和/反序列化,暂时不考虑内存管理。

4.结构体必须有一个宏定义是否具有侵入性?

看起来每个序列化/反序列化的对象都要带一个宏定义似乎侵入性较强,但这种侵入性是完全无害 的,因为它只是定义了一个额外的函数而已,这个函数只会在序列化/反序列化的时候才会用到,不会对当前对象造成任何影响,还有一点是因为c++没有反射, 必须要通过某种方法来获取对象的元信息,纵观目前所有的序列化方案,只有这种方式是最简洁的,用户做最少的事情即可,这也是我选择这种方式的原因。

5.Kapok是如何实现序列化/反序列化的

Kapok的最底层是用到了rapidjson, 用它来实现对基本类型的序列化,对它做了一个简单的封装以便供上层使用,上面层就是序列化\反序列化实现层,主要是实现对对象元信息的解析和自动化的打包和解包。下面是Kapok序列化的一个示意图:

一个更好的C++序列化/反序列化库Kapok

6.Kapok的性能如何

初步测试对一个tuple进行序列化/反序列化一万次,发现Kapok的耗时和messagepack相当。

7.Kapok是否支持多语言

暂时不支持,先把c++版本做好再说,如果要支持多语言的话,需要用其它语言进行重写,比较麻烦,所以暂时不考虑支持多语言。


作者:佚名

来源:51CTO

相关文章
|
2月前
|
API C++ Windows
Visual C++运行库、.NET Framework和DirectX运行库的作用及常见问题解决方案,涵盖MSVCP140.dll丢失、0xc000007b错误等典型故障的修复方法
本文介绍Visual C++运行库、.NET Framework和DirectX运行库的作用及常见问题解决方案,涵盖MSVCP140.dll丢失、0xc000007b错误等典型故障的修复方法,提供官方下载链接与系统修复工具使用指南。
690 2
|
2月前
|
Ubuntu API C++
C++标准库、Windows API及Ubuntu API的综合应用
总之,C++标准库、Windows API和Ubuntu API的综合应用是一项挑战性较大的任务,需要开发者具备跨平台编程的深入知识和丰富经验。通过合理的架构设计和有效的工具选择,可以在不同的操作系统平台上高效地开发和部署应用程序。
157 11
|
2月前
|
缓存 算法 程序员
C++STL底层原理:探秘标准模板库的内部机制
🌟蒋星熠Jaxonic带你深入STL底层:从容器内存管理到红黑树、哈希表,剖析迭代器、算法与分配器核心机制,揭秘C++标准库的高效设计哲学与性能优化实践。
C++STL底层原理:探秘标准模板库的内部机制
|
2月前
|
IDE 编译器 开发工具
msvcp100.dll,msvcp120.dll,msvcp140.dll,Microsoft Visual C++ 2015 Redistributable,Visual C++ 运行库安装
MSVC是Windows下C/C++开发核心工具,集成编译器、链接器与调试器,配合Visual Studio使用。其运行时库(如msvcp140.dll)为程序提供基础函数支持,常因缺失导致软件无法运行。通过安装对应版本的Microsoft Visual C++ Redistributable可解决此类问题,广泛应用于桌面软件、游戏及系统级开发。
388 2
|
2月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
199 1
|
2月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
225 1
|
3月前
|
并行计算 C++ Windows
|
6月前
|
存储 Java 编译器
说一说关于序列化/反序列化中的细节问题
我是小假 期待与你的下一次相遇 ~
126 1
|
6月前
|
JSON Java 数据库连接