我需要在 protobuf(proto3 语法)中指定带有可选字段的消息。就 proto 2 语法而言,我想表达的信息是这样的:
message Foo { required int32 bar = 1; optional int32 baz = 2; }
据我了解,“可选”概念已从语法 proto 3(以及必需的概念)中删除。虽然尚不清楚替代方案 - 使用默认值来说明尚未从发件人指定字段,但如果默认值属于有效值域(例如考虑布尔类型),则会留下歧义。
那么,我应该如何对上面的消息进行编码?谢谢你。
从 protobuf 3.15 版开始,proto3 支持使用optional关键字(就像在 proto2 中一样)来提供标量字段存在信息。
optional
syntax = "proto3"; message Foo { int32 bar = 1; optional int32 baz = 2; }
为上面的字段生成一个has_baz()/hasBaz()方法optional,就像在 proto2 中一样。
has_baz()
hasBaz()
正如 CyberSnoopy 的回答所建议的那样,在底层,protoc有效地对待一个optional字段,就好像它是使用oneof包装器声明的:
oneof
message Foo { int32 bar = 1; oneof optional_baz { int32 baz = 2; } }
如果您已经使用了这种方法,那么您现在可以简化您的消息声明(从 切换oneof到optional)和代码,因为有线格式是相同的。
有关字段存在和optionalproto3 的详细信息可以在应用说明:字段存在文档中找到。
历史记录:对 proto3 的实验性支持optional于 2020 年 4 月 23 日在此评论中首次宣布。使用它需要--experimental_allow_proto3_optional在 3.12-3.14 版本中传递 protoc 标志。
--experimental_allow_proto3_optional