我们如何在protobuf消息中放置变体消息(少数消息类型之一)?
message typeA { .... } message typeB { .... } message typeC { [typeB|typeA] payload; }
Kenton Varda.. 26
你需要这样做:
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是同一作者(我)的新序列化系统:Cap'n Proto 为此目的实现了"联合".在离开Google之前,我还在Protobufs中实现了工会,但在我离开之前没有设法将我的更改合并到主线.抱歉.:(
编辑:看起来Protobuf团队最终合并了我的更改并发布了2.6.0版本.:)见的oneof
声明.
你需要这样做:
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是同一作者(我)的新序列化系统:Cap'n Proto 为此目的实现了"联合".在离开Google之前,我还在Protobufs中实现了工会,但在我离开之前没有设法将我的更改合并到主线.抱歉.:(
编辑:看起来Protobuf团队最终合并了我的更改并发布了2.6.0版本.:)见的oneof
声明.
查看oneof
2.6版中的新功能:https://developers.google.com/protocol-buffers/docs/reference/java-generated#oneof
你现在可以这样做:
message TypeC { oneof oneof_name { TypeA a = 1; TypeB b = 2; } }
相同的字段oneof
将共享内存,并且只能同时设置一个字段.