仅需三行代码即可完成C++序列化,我惊呆了

《开源精选》是我们分享 Github、Gitee 等开源社区中优质项目的栏目,包括技术、学习、实用与各种有趣的内容。本期推荐的是一个开源的 C++序列化库——FdogSerialize。

仅需三行代码即可完成C++序列化,我惊呆了

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

功能特性

第一阶段

  • • 支持由基础类型和 Json 互转

  • • 支持由基础类型组成的数组和 json 互转

  • • 支持由基础类型组合成结构体类型和 Json 互转

  • • 支持由结构体包含结构体的类型和 Json 互转

  • • 支持 vector 类型和 json 互转

  • • 支持 list 类型和 json 互转

  • • 支持 map 类型和 json 互转

  • • 支持 set 类型和 json 互转

第二阶段

  • • 支持 STL 和自定义类型多层嵌套

  • • 对第一阶段所使用的接口进行优化,将多个接口整合为一个,方便调用

第三阶段

  • • 支持对 json 字符串进行格式正确判断(开发中

  • • 支持获取某个字段是否存在(开发中

  • • 支持获取某个字段的值,而无须先进行序列化(开发中

第四阶段

  • • 支持必选字段和可选字段,当必选字段无值时,进行报错(定义为指针类型即为可选字段)(开发中

  • • 支持XML数据格式的转换(开发中

杂项支持

  • • 支持别名

  • • 支持字段忽略

  • • 支持忽略大小写

  • • 支持字段为空,则不进行序列化(开发中

  • • 支持模糊转换(开发中

类型支持

基于 C++的基础类型,FdogSerialize 支持十六种类型,只要你的结构体中最基本类型在这十六种范围之内,便可完成转换。

仅需三行代码即可完成C++序列化,我惊呆了

最基本类型说明:

虽然 school 这个结构体包含了一种最基础类型和一种自定义类型,但追寻本质,自定义类型的底层都属于最基本类型。因此 school 这个结构体完全可以被正常解析,事实上是任意类型都可以解析。

struct headmaster{
    char * name;
    int age;
};

struct school{
    char * schoolName;
    headmaster info;
};

示例说明

序列化和反序列化各提供三个函数:

仅需三行代码即可完成C++序列化,我惊呆了

仅需三行代码即可完成C++序列化,我惊呆了

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)
    //依次添加

//两个宏的定义准则:使用该自定义类型做为其他自定义类型的成员

杂项支持

仅需三行代码即可完成C++序列化,我惊呆了

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 和对象中的键值不相同,开启后将根据模糊等级进行匹配。


传送门

开源协议:Apache2.0

开源地址:https://github.com/HuaGouFdog/FdogSerialize

-END-


原文始发于微信公众号(开源技术专栏):仅需三行代码即可完成C++序列化,我惊呆了

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/79581.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!