原文
protobuf
会根据proto
文件生成c++
对象及其序化/反序化
方法,而iguana
的struct_pb
则是以结构
为核心,编译期
反射来生成序化/反序化代码
.
有人提出能不能按proto
文件输出结构
呢,这样就可给其它语言
用了,很好建议,实现起来
也比较简单.
protobuf
是从proto
文件到c++
对象,而struct_pb
则是反之,通过C++
结构生成proto
文件.
假设有此一个结构
:
struct pair_t {
int x;
int y;
};
REFLECTION(pair_t, x, y);
enum Color { Red = 0, Black = 2, Green = 4 };
struct vector_t {
int id;
Color color;
std::variant<int, pair_t, std::string> variant;
std::vector<int> ids;
std::vector<pair_t> pairs;
std::vector<std::string> strs;
std::map<std::string, pair_t> map;
std::string name;
std::optional<int> op_val;
};
vector_t
中有pair_t
嵌套结构,枚举类型,vector
类型,map
类型及变量
类型,这样一个结构
,如何自动生成
对应的pbproto
文件呢?
struct_pb
提供了个很简单易用
的接口:
std::string str;
iguana::to_proto<vector_t>(str, "pb"); //#2
std::cout << str;
#2
代码会把proto
串输出到str
中,"pb"
参数是名字空间名
,默认
为空.最终输出
的proto
文本内容如下:
syntax = "proto3";
package pb;
option optimize_for = SPEED;
option cc_enable_arenas = true;
message vector_t {
int32 id = 1;
Color color = 2;
oneof variant {
int32 one_of_int32 = 3;
pair_t one_of_pair_t = 4;
string one_of_string = 5;
}
repeated int32 ids = 6;
repeated pair_t pairs = 7;
repeated string strs = 8;
map<string, pair_t> map = 9;
string name = 10;
int32 op_val = 11;
}
message pair_t {
int32 x = 1;
int32 y = 2;
}
enum Color {
Red = 0;
Black = 2;
Green = 4;
}
这样就避免
了自己再根据结构
翻译到proto
格式的文件了,剩下的就是在文件
中保存它,给其它语言
使用了.