本期推荐的是一个开源的C++序列化库——FdogSerialize。
FStruct是一个用于C++序列化的开源库,采用非入侵方式,无需在原有结构体上进行修改,目前支持基础类型,基础类型数组,结构体,以及vector,list,map等数据类型的序列化,支持JSON和XML两种数据格式,支持别名,支持忽略字段,最少三行代码即可完成转换。
功能特性
第一阶段
- 支持由基础类型和Json互转
- 支持由基础类型组成的数组和json互转
- 支持由基础类型组合成结构体类型和Json互转
- 支持由结构体包含结构体的类型和Json互转
- 支持vector类型和json互转
- 支持list类型和json互转
- 支持map类型和json互转
- 支持set类型和json互转
第二阶段
- 支持STL和自定义类型多层嵌套
- 对第一阶段所使用的接口进行优化,将多个接口整合为一个,方便调用
第三阶段
- 支持对json字符串进行格式正确判断(开发中)
- 支持获取某个字段是否存在(开发中)
- 支持获取某个字段的值,而无须先进行序列化(开发中)
第四阶段
- 支持必选字段和可选字段,当必选字段无值时,进行报错(定义为指针类型即为可选字段)(开发中)
- 支持XML数据格式的转换(开发中)
杂项支持
- 支持别名
- 支持字段忽略
- 支持忽略大小写
- 支持字段为空,则不进行序列化(开发中)
- 支持模糊转换(开发中)
类型支持
基于C++的基础类型,FdogSerialize支持十六种类型,只要你的结构体中最基本类型在这十六种范围之内,便可完成转换。
序号 |
基础类型 |
说明 |
序号 |
基础类型 |
说明 |
1 |
bool |
布尔类型 |
9 |
unsigned int |
无符号整型 |
2 |
char |
无符号字符型 |
10 |
long |
长整型 |
3 |
unsigned char |
无符号字符型 |
11 |
unsigned long |
无符号长整型 |
4 |
**char *** |
字符指针(字符串类型) |
12 |
long long |
超长整型 |
5 |
short |
短整型 |
13 |
unsigned long long |
无符号超长整型 |
6 |
unsigned short |
无符号短整型 |
14 |
float |
单精度浮点类型 |
7 |
int |
整型 |
15 |
double |
双进度浮点类型 |
8 |
unsigned int |
无符号整型 |
16 |
long double |
长双进度浮点类型 |
最基本类型说明:
虽然school这个结构体包含了一种最基础类型和一种自定义类型,但追寻本质,自定义类型的底层都属于最基本类型。因此school这个结构体完全可以被正常解析,事实上是任意类型都可以解析。
struct headmaster{
char * name;
int age;
};
struct school{
char * schoolName;
headmaster info;
};
示例说明
序列化和反序列化各提供三个函数:
序列化调用函数 |
说明 |
FSerialize(string & json_, T & object_, string name = “”) |
基础类型及结构体类型调用 |
FSerializeA(string & json_, T & object_, string name = “”) |
数组,vector,list调用 |
FSerializeS(string & json_, T & object_, string name = “”) |
set,map类型调用 |
反序列化调用函数 |
说明 |
FSerialize( T & object_, string & json_, string name = “”) |
基础类型及结构体类型调用 |
FSerializeA( T & object_, string & json_, string name = “”) |
数组,vector,list类型调用 |
FSerializeS( T & object_, string & json_, string name = “”) |
set,map类型调用 |
1 基础类型序列化
#include "fdogserialize.h" //添加序列化所需头文件
int main()
{
int value = 10;
string json_;
//将value转为json格式数据,建议使用第二种类型
FdogSerialize::Instance()->FSerialize(json_, value); //json值为 "{10}"
FdogSerialize::Instance()->FSerialize(json_, value, "value"); //json值为"{"value":10}"
//将json格式数据转为value 需保证json_为正确格式字符串
FdogSerialize::Instance()->FDesSerialize(value, json_);
return 0;
}
2 基础类型数组序列化
#include "fdogserialize.h" //添加序列化所需头文件
int main()
{
int valueArray[5] = {1,2,3,4,5};
string json_;
//将valueArray转为json格式数据,建议使用第二种类型
FdogSerialize::Instance()->FSerialize(json_, value); //json值为 "{[1,2,3,4,5]}"
FdogSerialize::Instance()->FSerialize(json_, value, "value"); //json值为"{"valueArray":[1,2,3,4,5]}"
//将json格式数据转为value 需保证json_为正确格式字符串
FdogSerialize::Instance()->FDesSerialize(value, json_);
}
3 基础类型组成的结构体序列化
#include "fdogserialize.h" //添加序列化所需头文件
//自定义基础类型结构体
struct student{
char * name;
int age;
};
int main()
{
REGISTEREDMEMBER(student, name, age); //需要注册自定义类型,第一个参数为自定义结构体名,后面参数依次为成员名
struct stu;
stu.name = "花狗Fdog";
stu.age = 22;
string json_;
//将value转为json格式数据
FdogSerialize::Instance()->FSerialize(json_, value, "stu"); //json值为"{"stu":{"name":"花狗Fdog","age":22}}"
//将json格式数据转为value 需保证json_为正确格式字符串
FdogSerialize::Instance()->FDesSerialize(value, json_);
}
4 vector类型的序列化
#include "fdogserialize.h" //添加序列化所需头文件
//自定义基础类型结构体
struct student{
char * name;
int age;
};
int main()
{
REGISTEREDMEMBER(student, name, age); //需要注册自定义类型,第一个参数为自定义结构体名,后面参数依次为成员名
vector<student> stu;
struct stu_1;
stu_1.name = "花狗Fdog";
stu_1.age = 22;
struct stu_2;
stu_2.name = "黑狗Fdog";
stu_2.age = 23;
stu.push_back(stu_1);
stu.push_back(stu_2);
string json_;
//将value转为json格式数据
FdogSerialize::Instance()->FSerializeA(json_, stu, "stu");
//json值为"{"stu":[{"name":"花狗Fdog","age":22},{"name":"黑狗Fdog","age":23}]}"
//将json格式数据转为value 需保证json_为正确格式字符串
FdogSerialize::Instance()->FDesSerializeA(value, json_);
}
5 list类型的序列化
#include "fdogserialize.h" //添加序列化所需头文件
//自定义基础类型结构体
struct student{
char * name;
int age;
};
int main()
{
REGISTEREDMEMBER(student, name, age); //需要注册自定义类型,第一个参数为自定义结构体名,后面参数依次为成员名
list<student> stu;
struct stu_1;
stu_1.name = "花狗Fdog";
stu_1.age = 22;
struct stu_2;
stu_2.name = "黑狗Fdog";
stu_2.age = 23;
stu.push_back(stu_1);
stu.push_back(stu_2);
string json_;
//将value转为json格式数据
FdogSerialize::Instance()->FSerializeA(json_, stu, "stu");
//json值为"{"stu":[{"name":"花狗Fdog","age":22},{"name":"黑狗Fdog","age":23}]}"
//将json格式数据转为value 需保证json_为正确格式字符串
FdogSerialize::Instance()->FDesSerializeA(value, json_);
}
6 map类型的序列化
#include "fdogserialize.h" //添加序列化所需头文件
//自定义基础类型结构体
struct student{
char * name;
int age;
};
int main()
{
REGISTEREDMEMBER(student, name, age); //需要注册自定义类型,第一个参数为自定义结构体名,后面参数依次为成员名
vector<student> stu;
struct stu_1;
stu_1.name = "花狗Fdog";
stu_1.age = 22;
struct stu_2;
stu_2.name = "黑狗Fdog";
stu_2.age = 23;
stu.push_back(stu_1);
stu.push_back(stu_2);
string json_;
//将value转为json格式数据
FdogSerialize::Instance()->FSerializeA(json_, stu, "stu");
//json值为"{"stu":[{"name":"花狗Fdog","age":22},{"name":"黑狗Fdog","age":23}]}"
//将json格式数据转为value 需保证json_为正确格式字符串
FdogSerialize::Instance()->FDesSerializeA(value, json_);
}
7 必要说明
//需要在宏Serialize_type_judgment_all定义下添加嵌套结构体
#define Serialize_type_judgment_all\
Serialize_type_judgment(student)
//依次添加
//需要在宏Serialize_type_judgment_all定义下添加嵌套结构体
#define DesSerialize_type_judgment_all\
DesSerialize_type_judgment(student)
//依次添加
//两个宏的定义准则:使用该自定义类型做为其他自定义类型的成员
杂项支持
杂项函数支持 |
说明 |
setAliasName(string Type, string memberName, string AliasName) |
使用别名 |
setIgnoreField(string Type, string memberName) |
忽略字段 |
setIgnoreLU(string Type, string memberName) |
忽略大小写 |
setFuzzy(string Type) |
模糊转换 |
1 支持别名
#include "fdogserialize.h" //添加序列化所需头文件
//自定义基础类型结构体
struct student{
char * name;
int age;
};
int main()
{
REGISTEREDMEMBER(student, name, age); //需要注册自定义类型,第一个参数为自定义结构体名,后面参数依次为成员名
FdogSerialize::Instance()->setAliasName("student", "name", "Aliasname");
//第一个参数为类型,第二参数为原名,第三个参数为别名
//除此之外,也可以使用setAliasNameAll设置多个参数的别名
struct stu;
stu.name = "花狗Fdog";
stu.age = 22;
string json_;
FdogSerialize::Instance()->FSerialize(json_, value); //json值为"{{"Aliasname":"花狗Fdog","age":22}}"
}
2 支持字段忽略
#include "fdogserialize.h" //添加序列化所需头文件
//自定义基础类型结构体
struct student{
char * name;
int age;
};
int main()
{
REGISTEREDMEMBER(student, name, age); //需要注册自定义类型,第一个参数为自定义结构体名,后面参数依次为成员名
FdogSerialize::Instance()->setIgnoreField("student", "name");
//第一个参数为类型,第二参数为需要忽略的字段
//除此之外,也可以使用setIgnoreFieldAll设置多个忽略的字段
struct stu;
stu.name = "花狗Fdog";
stu.age = 22;
string json_;
FdogSerialize::Instance()->FSerialize(json_, value); //json值为"{{"age":22}}"
}
3 支持忽略大小写
当将json转为对象时,如json中的键值与对象中的成员名存在大小写不同,可以设定忽略大小写。
#include "fdogserialize.h" //添加序列化所需头文件
//自定义基础类型结构体
struct student{
char * name;
int age;
};
int main()
{
REGISTEREDMEMBER(student, name, age);
struct stu;
FdogSerialize::Instance()->setIgnoreLU("student", "name");
string stu_json = "{\"Name\":\"yujing\", \"AGE\":21}";
FdogSerialize::Instance()->FDesSerialize(json_, value);
}
4 支持模糊转换
若json和对象中的键值不相同,开启后将根据模糊等级进行匹配。
—END—
开源协议:Apache2.0