Protocol buffers 我们如何在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 {

我们如何在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 {
        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
,你太棒了!