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

Tom*_*man 10 protocol-buffers

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

message typeA {
    ....
}

message typeB {
    ....
}

message typeC {
    [typeB|typeA] payload;
}
Run Code Online (Sandbox Code Playgroud)

Ken*_*rda 26

你需要这样做:

message TypeC {
  optional TypeA a = 1;
  optional TypeB b = 2;
}
Run Code Online (Sandbox Code Playgroud)

如果有很多变体,您可能还需要添加标记字段,这样就不必检查has_*()每个变体.

这在Protobuf文档中有所介绍:https: //developers.google.com/protocol-buffers/docs/techniques#union

PS.Protobufs的这个缺失功能​​在Cap'n Proto中得到修复,Cap'n Proto是同一作者(我)的新序列化系统:Cap'n Proto 为此目的实现了"联合".在离开Goog​​le之前,我还在Protobufs中实现了工会,但在我离开之前没有设法将我的更改合并到主线.抱歉.:(

编辑:看起来Protobuf团队最终合并了我的更改并发布了2.6.0版本.:)见oneof声明.

  • 感谢你创造了'oneof`,你摇滚! (2认同)

yel*_*von 18

查看oneof2.6版中的新功能:https://developers.google.com/protocol-buffers/docs/reference/java-generated#oneof

你现在可以这样做:

message TypeC {
    oneof oneof_name {
        TypeA a = 1;
        TypeB b = 2;
    }
}
Run Code Online (Sandbox Code Playgroud)

相同的字段oneof将共享内存,并且只能同时设置一个字段.

  • @ChrisMcCowan不幸的是,oneof的不允许重复的字段 (2认同)