Protocol Buffers(protobuf)v3.0.0-alpha-2中的可选字段和约束

Flo*_*ers 6 c++ serialization protocol-buffers

我目前正在使用Google Protocol Buffers的 v3.0.0-alpha-2 .

据我所知,v3删除了required关键字,extensions 字段的关键字和默认值,以简化原型语言.

我不明白的是optionalproto3中关键字的含义.

例:

syntax = "proto3";

package fw.example;

message ExampleMessage {
  optional string optional_string = 1;
  string normal_string = 2;
}
Run Code Online (Sandbox Code Playgroud)

问:是什么区别optional_string和normal_string 除了名称和标记?

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

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

  • 是optional在proto3过时,因为现场始终是可选的?
  • 如果不存在,如何使用proto3强制执行必填字段required?

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

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

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

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

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

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

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

And*_*yuk 7

我的推理如下:

既然required已经过时了,那么一切都是optional.因此没有明确关键字的原因.

语言指南中的以下段落指示如果未设置值,如何初始化值:

请注意,对于标量消息字段,一旦解析了消息,就无法确定字段是否显式设置为默认值(例如,布尔值是否设置为false)或者根本没有设置:您应该承担这一点在定义消息类型时要注意.

所以optional真的意味着"如果你没有明确地设置它,我们会为你设置它的默认值!"

请注意,这允许他们进行一些很好的优化(如果将其设置为默认值,则不包括线上的值):

例如,如果您不希望默认情况下也发生这种行为,那么当设置为false时,没有一个布尔值可以打开某些行为.另请注意,如果标量消息字段设置为其默认值,则该值不会在线路上序列化.

  • 在生成的代码上丢失"has_XXX"方法似乎是倒退一大步.尽管有上述建议,但尝试组织服务接口以实现这一点并不实际.我发现自己正在考虑嵌入消息(支持"has"),或者尴尬的交互,客户端可以请求所有默认值,然后"樱桃挑选"覆盖. (2认同)

baz*_*zza 6

proto3文档(“使用 proto2 消息类型”部分)表示您可以使用“import”关键字导入 proto2 .proto 文件,反之亦然。这意味着 v2 和 v3 .proto 语法是兼容的,并且意味着仍然支持可选和必需。

我说尝试一下,看看会发生什么。