我们如何在protobuf消息中放置变体消息(少数消息类型之一)?
message typeA {
....
}
message typeB {
....
}
message typeC {
[typeB|typeA] payload;
}
答案 0 :(得分:25)
你需要这样做:
message TypeC {
optional TypeA a = 1;
optional TypeB b = 2;
}
如果有很多变体,您可能还想添加标记字段,这样就不必为每个变体检查has_*()
。
Protobuf文档中介绍了这一点:https://developers.google.com/protocol-buffers/docs/techniques#union
PS。 Protobufs的这个缺失功能在Cap'n Proto中得到修复,这是同一作者(我)的新序列化系统:Cap'n Proto为此目的实现了"unions"。在离开Google之前,我还在Protobufs中实现了工会,但在我离开之前没有设法将我的更改合并到主线。抱歉。 :(
编辑:看起来Protobuf团队最终合并了我的更改并发布了2.6.0版本。 :)见theoneof
declaration。
答案 1 :(得分:17)
查看版本2.6中的新oneof
功能:https://developers.google.com/protocol-buffers/docs/reference/java-generated#oneof
您现在可以执行以下操作:
message TypeC {
oneof oneof_name {
TypeA a = 1;
TypeB b = 2;
}
}
同一oneof
中的字段将共享内存,并且只能同时设置一个字段。