【问题标题】:Optional fields and constraints in Protocol Buffers (protobuf) v3.0.0-alpha-2Protocol Buffers (protobuf) v3.0.0-alpha-2 中的可选字段和约束
【发布时间】:2015-07-09 22:26:27
【问题描述】:

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

据我了解 v3 删除了 required 关键字,extensions 字段的关键字和默认值以简化 proto 语言。

不懂的是proto3中optional关键字的含义。

例子:

syntax = "proto3";

package fw.example;

message ExampleMessage {
  optional string optional_string = 1;
  string normal_string = 2;
}

问题:optional_stringnormal_string有什么区别 除了名字和标签?

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

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

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

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

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

谁能启发我,在 proto3 消息,但允许方案演变?目前我认为一个新的 API 必须围绕proto3消息编写,以便客户端不处理 直接使用 proto3 生成的代码,但使用自定义 API 代码。就是它 对吗?

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

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

我们建议新的 Protocol Buffers 用户使用 proto3。然而,我们不 一般建议现有用户从 proto2 迁移 proto3 由于 API不兼容,我们会继续长期支持proto2。

如果 proto3 是可行的方法,为什么事情会变得复杂?在我看来,我确实需要编写比现在使用 proto2 更多的代码。

【问题讨论】:

  • 如果您的代码用于生产用途,我想我会坚持使用第 2 版,直到所有错误和文档错误都得到解决
  • @RichardHodges 但 proto3 的 json 序列化太棒了!

标签: c++ serialization protocol-buffers


【解决方案1】:

我的推理如下:

既然required 已经过时,那么一切都是optional。因此没有理由显式关键字。

language guide 中的以下段落指出如果未设置值如何初始化:

请注意,对于标量消息字段,一旦解析了消息,就会有 无法判断一个字段是否被显式设置为默认值 值(例如布尔值是否设置为 false)或未设置 完全可以:在定义消息类型时应牢记这一点。

所以optional 真正的意思是“如果你没有明确设置,我们会为你设置默认值!”

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

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

【讨论】:

  • 在生成的代码中丢失“has_XXX”方法似乎是一个很大的倒退。尽管有上述建议,但尝试组织服务接口以使其正常工作是不切实际的。我发现自己正在考虑嵌入消息(支持“has”)或尴尬的交互,客户端可以请求所有默认值,然后“cherry-pick”覆盖。
【解决方案2】:

proto3 documentation(“使用 proto2 消息类型”一节)说您可以使用 'import' 关键字导入 proto2 .proto 文件,反之亦然。这意味着 v2 和 v3 .proto 语法是兼容的,这意味着仍然支持 optional 和 required 。

我说试试看会发生什么。

【讨论】:

    【解决方案3】:

    proto3 的最终版本没有optional 关键字。在 proto3 中,all fields are optional.

    【讨论】:

      猜你喜欢
      • 2020-08-15
      • 1970-01-01
      • 2022-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多