我目前正在使用Google Protocol Buffers的v3.0.0-alpha-2。
据我了解,v3删除了required
关键字,extensions
用于简化原型语言的字段的关键字和默认值。
我不了解的是proto3中optional
关键字的含义。
示例:的
syntax = "proto3";
package fw.example;
message ExampleMessage {
optional string optional_string = 1;
string normal_string = 2;
}
问题: optional_string
和normal_string
之间有什么区别
除了名称和标签?
我已经阅读了以下资源(它们似乎是唯一的公开资源 可用于protobuf的v3):
但他们甚至没有提到optional
关键字。
optional
是否已过时,因为字段始终是可选的?required
消失,如何使用proto3强制执行必填字段?似乎在proto3中,人们无法再区分未设置的字段和 客户端设置的字段为(隐式)默认值。
最好的做法是将每个proto3消息包装在特定于语言的类中吗? 我正在使用C ++,我需要确保设置特定的字段。看起来 验证必须在现在的语言特定源代码中手动完成 与proto2相反。
有人可以启发我,在a上应用约束的最佳方法是什么 proto3消息,但允许方案演变?目前我认为是一个新的API 必须围绕proto3消息编写,以便客户端不会处理 直接使用proto3生成的代码,但使用自定义API代码。就是它 正确的吗?
也许有人可以给我一个具体的例子来讨论。
我很困惑,因为v3的发行说明中说明了以下内容:
我们建议新的Protocol Buffers用户使用proto3。但是,我们没有 通常建议现有用户从proto3迁移到proto3 API不兼容,我们将继续支持proto2很长一段时间。
如果proto3是要走的路,为什么事情变得复杂?在我看来,我现在需要编写比使用proto2更多的代码。
答案 0 :(得分:7)
我的推理如下:
由于required
已过时,因此所有内容均为optional
。因此没有明确关键字的原因。
language guide中的以下段落表示如果未设置值,将如何初始化值:
请注意,对于标量消息字段,一旦解析了消息,就会出现 无法确定某个字段是否已明确设置为默认值 value(例如,布尔值是否设置为false)或者没有设置 根本没有:在定义消息类型时,您应该牢记这一点。
所以optional
的确意味着“如果你没有明确地设置它,我们会为你设置默认值!”
请注意,这允许他们进行一些不错的优化(如果设置为默认值,则不包括线路上的值):
例如,没有一个布尔值可以在什么时候打开某些行为 如果您不希望该行为也发生,则设置为false 默认。另请注意,如果标量消息字段设置为其 默认情况下,该值不会在线路上序列化。
答案 1 :(得分:4)
proto3 documentation(部分"使用proto2消息类型")表示您可以使用' import'导入proto2 .proto文件。关键字,反之亦然。这意味着v2和v3 .proto语法是兼容的,这意味着仍然支持可选和必需。
我说试一试,看看会发生什么。
答案 2 :(得分:2)
proto3的最终版本没有optional
关键字。在proto3中,all fields are optional。