在《使用 acl 库针对 C++ 对象进行序列化及反序列编程》中介绍了 acl 库中针对 C/C++ 的 struct 对象进行序列化和反序列化的功能,并且给出了一个简单的例子。本文将介绍一些较为复杂的例子。
一、示例一:支持多继承的例子
先定义 struct.stub 文件:
#pragma once
#include
struct student
{
std::string shcool;
std::string class_name;
};
struct province
{
std::string province_name;
std::string position;
};
struct user : student, province
{
std::string name;
int age;
bool male;
};
上面的定义中,user 继承于 student 和 province。
然后使用 gson 工具(运行:./gson -d )根据此 struct.stub 生成目标源文件和头文件:gson.cpp, gson.h, struct.h。
下面就可以编写业务逻辑代码:
#include "stdafx.h"
#include
#include
#include
编译并运行该例子,结果如下:
serialize:
json: {"shcool": "大学", "class_name": "班级", "province_name": "省", "position": "位置", "name": "zsx", "age": 11, "male": true}
deserialize:
name: zsx, age: 11, male: yes
province_name: 省, position: 位置
shcool: 大学, class_name: 班级
二、示例二:支持 C++11 的例子
定义 struct.stub 文件如下:
#pragma once
struct user
{
// 带参数的构造函数
user(const char* user_name, const char* user_domain,
int user_age, bool user_male)
: username(user_name)
, domain(user_domain)
, age(user_age)
, male(user_male)
{}
user() {}
~user() {}
acl::string username;
acl::string domain;
int age = 100;
bool male = true;
};
struct message
{
int type;
acl::string cmd;
std::list user_list;
std::list user_vector;
std::map user_map;
std::list *user_list_ptr = nullptr;
std::vector *user_vector_ptr = nullptr;
std::map *user_map_ptr = nullptr;
int n = 100; // c++11 允许初始化成员变量
long n1 = 1000;
long long int n2 = 1000;
short n3 = 100;
//Gson@optional
user* u = nullptr;
message() {}
~message()
{
if (user_list_ptr)
{
for (auto it : *user_list_ptr)
delete it;
delete user_list_ptr;
}
if (user_vector_ptr)
{
for (auto it : *user_vector_ptr)
delete it;
delete user_vector_ptr;
}
if (user_map_ptr)
{
for (auto it : *user_map_ptr)
delete it.second;
delete user_map_ptr;
}
}
};
用 gson 工具将上述 stub 文件生成同样的三个文件:gson.cpp, gson.h, struct.h,然后编写业务处理代码如下:
#include "stdafx.h"
#include
#include
#include
上述例子主要体现了 gson 的两个特点:1、允许有构造函数,2、支持 C++11 中的结构成员初始化。
三、参考
文章参考:《使用 acl 库针对 C++ 对象进行序列化及反序列编程》
更多示例:https://github.com/acl-dev/acl/tree/master/app/gson/test
acl github:https://github.com/acl-dev/acl
acl download: https://sourceforge.net/projects/acl/
QQ 群:242722074