2014-01-07 37 views

回答

20

你需要做的是这样的:

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

+0

感谢您创造'oneof',你摇滚! – FisherCoder

13

查核在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将共享存储器中,只有一个字段可以设为同一时间。

+0

如何确认设置了哪一个?我有int,字符串,布尔等,那么如何确定哪一个被填充? – odiszapc

+0

目前我正在使用下面的测试,但protobuffer可能有更优雅的东西: '!Proto.GetData.getDefaultInstance()。equals(all.getGetData());' – MikeR

+0

另一种方法是做一个开关在执行'all.getMessageCase()'时出现的字符串值 – MikeR