我们如何在protobuf消息中放置变体消息(少数消息类型之一)?

时间:2014-01-07 11:47:39

标签: protocol-buffers

我们如何在protobuf消息中放置变体消息(少数消息类型之一)?

message typeA {
    ....
}

message typeB {
    ....
}

message typeC {
    [typeB|typeA] payload;
}

2 个答案:

答案 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"。在离开Goog​​le之前,我还在Protobufs中实现了工会,但在我离开之前没有设法将我的更改合并到主线。抱歉。 :(

编辑:看起来Protobuf团队最终合并了我的更改并发布了2.6.0版本。 :)见the oneof 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中的字段将共享内存,并且只能同时设置一个字段。