从protobuf版本3.12开始,proto3在实验上支持使用optional
关键字(就像proto2中一样)给出标量字段存在信息。
syntax = "proto3";
message Foo {
int32 bar = 1;
optional int32 baz = 2;
}
就像在proto2中一样,为上面的字段生成一个has_baz()
/hasBaz()
方法optional
。
像CyberSnoopy的回答所示,在底层,protoc有效地将optional
字段视为使用oneof
包装器声明的字段:
message Foo {
int32 bar = 1;
oneof optional_baz {
int32 baz = 2;
}
}
如果您已经使用了这种方法,则proto3支持从实验状态毕业后,您就可以清理您的消息声明(从切换oneof
到optional
)optional
,因为有线格式是相同的。
您可以optional
在应用笔记:现场状态文档中找到有关现场状态的详细信息,并在proto3中找到。
将--experimental_allow_proto3_optional
标记传递给协议以使用版本3.12中的此功能。该功能公告称它将“通常有望在3.13中可用”。
2020年11月更新:该功能在3.14版中仍被视为实验性(需要标记)。有迹象表明正在取得进展。