一个更好的C++序列化/反序列化库Kapok
1.Kapok的特点
简单,易用,header-only,只需要引用Kapok.hpp即可;高效,初步测试性和messagepack相当。
它是纯c++11实现,因此需要支持C++11的编译器。
2.主要功能
对对象进行自动化的序列化和反序列化,用起来非常简单,先来看个序列化/反序列化一个tuple的例子吧。
- //序列化
- Serializer sr;
- auto tp = std::make_tuple(10, 12, string("test"));
- sr.Serialize(tp, "tuple");
- //反序列化
- DeSerializer dr;
- std::tuple<int, int, string> p;
- dr.Parse(sr.GetString());
- dr.Deserialize(p, "tuple");
看起来是不是很简单!
再看一个序列化一个自定义对象的例子。
- struct Person
- {
- int age;
- string name;
- string city;
- META(age, name, city)
- };
- Person p = { 18, "bb", "aa" };
- //序列化
- Serializer sr;
- sr.Serialize(p, "Person");
- //反序列化
- DeSerializer dr;
- Person person;
- dr.Parse(sr.GetString());
- dr.Deserialize(person, "Person");
一样的很简单,结构这里需要一个宏定义META,这个META的作用就是获取对象的元信息,有了这个元信息我们就可以很方便的实现序列化和反序列化了。
3.应用场景
Kapok除了不支持指针之外所有的对象都支持,支持结构体的无限嵌套(被嵌套的结构体也必须定义META宏)。这里说一下为 什么不支持指针呢,因为对象中有指针的话存在两个问题:1.这个指针如果是动态数组的话,c++中无法获取这个数组的长度;2.指针还涉及到内存管理,我 希望Kapok专注于序列化和/反序列化,暂时不考虑内存管理。
4.结构体必须有一个宏定义是否具有侵入性?
看起来每个序列化/反序列化的对象都要带一个宏定义似乎侵入性较强,但这种侵入性是完全无害 的,因为它只是定义了一个额外的函数而已,这个函数只会在序列化/反序列化的时候才会用到,不会对当前对象造成任何影响,还有一点是因为c++没有反射, 必须要通过某种方法来获取对象的元信息,纵观目前所有的序列化方案,只有这种方式是最简洁的,用户做最少的事情即可,这也是我选择这种方式的原因。
5.Kapok是如何实现序列化/反序列化的
Kapok的***层是用到了rapidjson, 用它来实现对基本类型的序列化,对它做了一个简单的封装以便供上层使用,上面层就是序列化\反序列化实现层,主要是实现对对象元信息的解析和自动化的打包和解包。下面是Kapok序列化的一个示意图:
6.Kapok的性能如何
初步测试对一个tuple进行序列化/反序列化一万次,发现Kapok的耗时和messagepack相当。
7.Kapok是否支持多语言
暂时不支持,先把c++版本做好再说,如果要支持多语言的话,需要用其它语言进行重写,比较麻烦,所以暂时不考虑支持多语言。
相关文章
- Java要抛弃祖宗的基业,Java程序员危险了!
- 十大 Java 语言特性
- JVM 三色标记算法,原来是这么回事!
- 聊聊 Spring 事务控制策略以及 @Transactional 失效问题避坑
- 写给 Java 程序员的前端 Promise 教程
- 写给 Java 程序员的前端 Promise 教程,你学会了吗?
- Java 中为什么不全部使用 Static 方法?
- Java 池化技术你了解多少?
- Java 服务 Docker 容器化优秀实践
- Spring Boot + EasyExcel导入导出,简直太好用了!
- 我们一起聊聊 Java 内存泄漏
- CentOS 下安装 Docker 极简教程
- JDK 19 功能集冻结:Java 19 只有七个新特性
- 关于 CMS 垃圾回收器,你真的懂了吗?
- 为什么会有这么多编程语言?
- 改善Java代码的八个建议
- 接口流量突增,如何做好性能优化?
- Java 以编程方式创建JAR文件
- POJO、Java Bean是如何定义的
- Spring 的 Bean 明明设置了 Scope 为 Prototype,为什么还是只能获取到单例对象?