C++ 结构体转json

FdogSerialize是一个C++序列化库,支持非入侵方式,可序列化基础类型、数组、结构体、vector、list、map等,支持JSON和XML格式,提供别名、忽略字段等功能。它包括behavior.h、fdogserialize.h和fdogserialize.cpp三个文件,适用于C++11,依赖正则表达式,适用于GCC 4.9及以上版本。
摘要由CSDN通过智能技术生成

??FdogSerialize??
FdogSerialize是一个用于C++序列化的开源库,采用非入侵方式,无需在原有结构体上进行修改,目前支持基础类型,基础类型数组,结构体,以及vector,list,map等数据类型的序列化,支持JSON和XML两种数据格式,支持别名,支持忽略字段,最少三行代码即可完成转换。

github地址:FdogSerialize开源库

代码中有使用到C++11特性,并且使用到了正则表达式,若是linux编译,需保证gcc版本在4.9(4.8不支持正则表达式)
该库包括behavior.h,fdogserialize.h,fdogserialize.cpp,三个文件。

您需要将声明结构体的头文件添加在behavior.h,并且behavior.h有事先写好的两个宏定义,如果您有使用到结构体类型作为结构体成员的序列化,无论是单个结构体还是vector<结构体>,都需要在两个宏定义中添加对应的定义(基础类型不需要在behavior.h添加)。

fdogserialize.h,fdogserialize.cpp是核心代码,在需要序列化的源文件中添加fdogserialize.h即可调用相关的序列化函数,为了更详细的说明该库的使用,准备了测试示例放在test.h头文件,以及main.cpp中的相关测试。
起源
经常使用java或者go的人应该知道这些语言在进行序列化和反序列化是很容易的,但是对于C++而言,这是困难的,根本原因是C++不支持反射,基于c++的语言哲学,C++宁死也要坚守的zero overhead,不为用不到的特性付出任何代价,不管这个代价有多小,也不管是怎样的语言特性,都不会妥协。

虽然C++不支持反射,但是我们依旧可以通过自己的方式实现序列化与反序列化,记得我在大二时用C++写的一个client-server小项目,自己规定了传输的数据格式(当时觉得自己解析Json很麻烦),第一个字段应该是什么,第二个字段应该是什么,正是因为没有方便的函数进行转换,我每次都需要使用非常繁琐的代码去拼出一个可以传递的字符串,是的,这样确实可以完成我想要的功能,但是我自己定的数据格式只适合自己用,这种方式长期必然行不通,而大多数人使用JSON和XML这两种数据格式来保存对象,如果我的项目想要使用这种大众化的数据格式,我又将重构我的代码。

我试着在github寻找一些用于C++的序列化与反序列的库,看看有没有什么办法可以帮助我快速把对象转变成JSON,我找到了一些类似的库,但是存在一些问题

??不太和我心意的设计:
使用者需要添加过多代码
采用入侵方式,需要改变原有的结构体
不需要入侵,但是在注册的时候需要一个一个指定类型
只支持基础类型组成的结构体转换
不支持别名(由于go的特性,在go中经常被使用)
不支持忽略字段
不支持指针类型(如果原项目中存在指针类型便需要指针类型)

既然心高气傲都不满意,那就自己动手写一个吧,一开始想的简单了,说实话后面还是有些难度的,虽然说C++中应该尽可能的少用宏,但就目前来说C++没有反射机制,编译后不保存结构体的元信息来说,不得不使用大量的宏。

??暂时将这个库分为下面几个阶段:
支持由基础类型和Json互转
支持由基础类型组成的数组和json互转
支持由基础类型组合成结构体类型和Json互转
支持由结构体包含结构体的类型和Json互转
支持ve

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值