我目前正在使用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相反。
有人能启发我吗,在约束上施加约束的最佳方法是什么
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/