欢迎来到小居数码网-一家分享数码知识,生活小常识的网站,希望可以帮助到您。

当前位置:生活小常识 > 数码知识 >
优质

c语言序列化(c++序列化库)

数码知识

周雯欣优秀作者

原创内容 来源:小居数码网 时间:2024-07-30 18:54:01 阅读() 收藏:29 分享:55

导读:您正在阅读的是关于【数码知识】的问题,本文由科普作家协会,生活小能手,著名生活达人等整理监督编写。本文有2791个文字,大小约为10KB,预计阅读时间7分钟。

《开源精选》是我们分享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支持十六种类型,只要你的结构体中最基本类型在这十六种范围之内,便可完成转换。

    序号基础类型说明序号基础类型说明1bool布尔类型9unsigned int无符号整型2char无符号字符型10long长整型3unsigned char无符号字符型11unsigned long无符号长整型4**char ***字符指针(字符串类型)12long long超长整型5short短整型13unsigned long long无符号超长整型6unsigned short无符号短整型14float单精度浮点类型7int整型15double双进度浮点类型8unsigned int无符号整型16long 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

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

    上面就是小居数码小编今天给大家介绍的关于(c++序列化库)的全部内容,希望可以帮助到你,想了解更多关于数码知识的问题,欢迎关注我们,并收藏,转发,分享。

    94%的朋友还想知道的:

    (572)个朋友认为回复得到帮助。

    部分文章信息来源于以及网友投稿,转载请说明出处。

    本文标题:c语言序列化(c++序列化库):http://sjzlt.cn/shuma/153007.html

    猜你喜欢