Protocol buffers 我们如何在protobuf消息中放入变体消息(几种消息类型之一)?
我们如何在protobuf消息中放入变体消息(几种消息类型之一)Protocol buffers 我们如何在protobuf消息中放入变体消息(几种消息类型之一)?,protocol-buffers,Protocol Buffers,我们如何在protobuf消息中放入变体消息(几种消息类型之一) message typeA { .... } message typeB { .... } message typeC { [typeB|typeA] payload; } 您需要这样做: message TypeC { optional TypeA a = 1; optional TypeB b = 2; } message TypeC { oneof oneof_name {
message typeA {
....
}
message typeB {
....
}
message typeC {
[typeB|typeA] payload;
}
您需要这样做:
message TypeC {
optional TypeA a = 1;
optional TypeB b = 2;
}
message TypeC {
oneof oneof_name {
TypeA a = 1;
TypeB b = 2;
}
}
如果有很多变体,您可能还需要添加一个标记字段,这样就不必为每个变体检查has*()
这在Protobuf文档中有介绍:
PS.Protobufs的这一缺失功能在一个新的序列化系统中得到了修复,该系统由同一作者(me)开发:Cap'n Proto为此实现。在离开谷歌之前,我还在Protobufs中实现了工会,但在离开之前,我并没有将我的变更合并到主线中。对不起(
编辑:Protobuf团队似乎最终合并了我的更改并发布了2.6.0版。:)请参阅。查看2.6版中新的
功能之一:
您现在可以执行以下操作:
message TypeC {
optional TypeA a = 1;
optional TypeB b = 2;
}
message TypeC {
oneof oneof_name {
TypeA a = 1;
TypeB b = 2;
}
}
同一个中的一个字段将共享内存,同时只能设置一个字段。如何检查设置了哪个字段?我有int、string、boolean等。那么如何确定哪个是填充的呢?目前我正在使用下面的测试,但是protobuffer可能有更优雅的东西:!Proto.GetData.getDefaultInstance().equals(all.GetData())代码>另一种方法是切换执行all.getMessageCase()
时出现的字符串值,如果TypeA和/或TypeB有一个可重复的成员,这仍然有效吗?@chrismckwan不幸的是,其中一个不允许重复创建oneof
,你太棒了!