Google-protobuf:如何使用 Google 协议缓冲区创建联合
Google-protobuf: How to create unions using Google protocol buffer
我目前正在尝试使用 Google C 语言的协议缓冲区。
我有点不确定如何使用 GPB 创建 C 联合。
例如proto文件如下:
message msgToSend
{
required Type msg_type=1; //Type is a predefined enum to determine message type
optional ReqMsg1 msg1=2;
optional ReqMsg2 msg2=3;
}
我希望在编译时生成一个 union
但生成的结构如下:
struct _msgToSend
{
ProtobufCMessage base;
Type msg_type;
ReqMsg1 msg1;
ReqMsg2 msg2;
}
我认为你做不到。
在 Protobuf 中 "optional" 并不像 C 联合那样意味着 "it's either this or this other";这意味着 "this might be here"。这就是为什么你得到一个可以表达两个可选字段的 C 结构。
在工作中,仅此一项就足以让我实现 Protobuf 替换系统,因为我们真的需要联合。
在 protobuf 中有一个专门的结构(不过我在 C++ 中使用它,不确定它是否可以在纯 C 中工作):
message MyUnion {
oneof MyUnionOneof {
bool booleanValue = 1;
string stringValue = 2;
}
}
看看这个 link:https://developers.google.com/protocol-buffers/docs/proto#oneof
我目前正在尝试使用 Google C 语言的协议缓冲区。 我有点不确定如何使用 GPB 创建 C 联合。
例如proto文件如下:
message msgToSend
{
required Type msg_type=1; //Type is a predefined enum to determine message type
optional ReqMsg1 msg1=2;
optional ReqMsg2 msg2=3;
}
我希望在编译时生成一个 union
但生成的结构如下:
struct _msgToSend
{
ProtobufCMessage base;
Type msg_type;
ReqMsg1 msg1;
ReqMsg2 msg2;
}
我认为你做不到。
在 Protobuf 中 "optional" 并不像 C 联合那样意味着 "it's either this or this other";这意味着 "this might be here"。这就是为什么你得到一个可以表达两个可选字段的 C 结构。
在工作中,仅此一项就足以让我实现 Protobuf 替换系统,因为我们真的需要联合。
在 protobuf 中有一个专门的结构(不过我在 C++ 中使用它,不确定它是否可以在纯 C 中工作):
message MyUnion {
oneof MyUnionOneof {
bool booleanValue = 1;
string stringValue = 2;
}
}
看看这个 link:https://developers.google.com/protocol-buffers/docs/proto#oneof