小编典典

如何在 protobuf 3 中定义可选字段

all

我需要在 protobuf(proto3 语法)中指定带有可选字段的消息。就 proto 2 语法而言,我想表达的信息是这样的:

message Foo {
    required int32 bar = 1;
    optional int32 baz = 2;
}

据我了解,“可选”概念已从语法 proto 3(以及必需的概念)中删除。虽然尚不清楚替代方案 -
使用默认值来说明尚未从发件人指定字段,但如果默认值属于有效值域(例如考虑布尔类型),则会留下歧义。

那么,我应该如何对上面的消息进行编码?谢谢你。


阅读 141

收藏
2022-08-07

共1个答案

小编典典

从 protobuf 3.15
开始,proto3
支持使用optional关键字(就像在 proto2 中一样)来提供标量字段存在信息。

syntax = "proto3";

message Foo {
    int32 bar = 1;
    optional int32 baz = 2;
}

为上面的字段生成一个has_baz()/hasBaz()方法optional,就像在 proto2 中一样。

正如 Cyber​​Snoopy
的回答所建议的那样,在底层,protoc
有效地对待一个optional字段,就好像它是使用oneof包装器声明的:

message Foo {
    int32 bar = 1;
    oneof optional_baz {
        int32 baz = 2;
    }
}

如果您已经使用了这种方法,那么您现在可以简化您的消息声明(从 切换oneofoptional)和代码,因为有线格式是相同的。

有关字段存在和optionalproto3
的详细信息可以在应用说明:字段存在文档中找到。

历史记录:对 proto3 的实验性支持optional于 2020 年 4 月 23
日在此评论中首次宣布。使用它需要--experimental_allow_proto3_optional
3.12-3.14 版本中传递 protoc 标志。

2022-08-07