我目前正在使用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尚不可用):
  • Protocol Buffers v3.0.0-alpha-2 Release Notes
  • proto3 Language Guide

  • 但是他们甚至没有提到optional关键字。
  • 因为字段始终是可选的,所以在proto3中optional是否已过时?
  • 如果required不见了,如何使用proto3强制执行必填字段?

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

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

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

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

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



    如果proto3是必经之路,那为什么事情会变得复杂?在我看来,与proto2相比,我确实需要编写更多的代码。

    最佳答案

    我的推理如下:

    由于required已过时,因此所有内容均为optional。因此,没有理由使用显式关键字。

    language guide的以下段落说明了如何设置(如果未设置)值:



    因此,optional的真正意思是“如果您未明确设置它,我们将为您将其设置为默认值!”

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

    关于c++ - Protocol Buffer (protobuf)v3.0.0-alpha-2中的可选字段和约束,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29963996/

    10-11 18:13