Protocol Buffers(protobuf)v3.0.0-alpha-2

时间:2015-04-30 09:29:51

标签: c++ serialization protocol-buffers

我目前正在使用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_stringnormal_string之间有什么区别 除了名称和标签?

我已经阅读了以下资源(它们似乎是唯一的公开资源 可用于protobuf的v3):

但他们甚至没有提到optional关键字。

  • proto3中optional是否已过时,因为字段始终是可选的?
  • 如果required消失,如何使用proto3强制执行必填字段?

似乎在proto3中,人们无法再区分未设置的字段和 客户端设置的字段为(隐式)默认值。

最好的做法是将每个proto3消息包装在特定于语言的类中吗? 我正在使用C ++,我需要确保设置特定的字段。看起来 验证必须在现在的语言特定源代码中手动完成 与proto2相反。

有人可以启发我,在a上应用约束的最佳方法是什么 proto3消息,但允许方案演变?目前我认为是一个新的API 必须围绕proto3消息编写,以便客户端不会处理 直接使用proto3生成的代码,但使用自定义API代码。就是它 正确的吗?

也许有人可以给我一个具体的例子来讨论。

我很困惑,因为v3的发行说明中说明了以下内容:

  

我们建议新的Protocol Buffers用户使用proto3。但是,我们没有   通常建议现有用户从proto3迁移到proto3   API不兼容,我们将继续支持proto2很长一段时间。

如果proto3是要走的路,为什么事情变得复杂?在我看来,我现在需要编写比使用proto2更多的代码。

3 个答案:

答案 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