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

标签 c++ serialization protocol-buffers

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

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

理解的是 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。

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

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

我很困惑,因为 v3 的发行说明中说明如下:

We recommend that new Protocol Buffers users use proto3. However, we do not generally recommend that existing users migrate from proto2 from proto3 due to API incompatibility, and we will continue to support proto2 for a long time.

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

最佳答案

我的推理如下:

由于 required 已过时,因此一切都是 optional。因此,没有理由使用显式关键字。

以下段落来自language guide指示如果未设置值将如何初始化:

Note that for scalar message fields, once a message is parsed there's no way of telling whether a field was explicitly set to the default value (for example whether a boolean was set to false) or just not set at all: you should bear this in mind when defining your message types.

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

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

For example, don't have a boolean that switches on some behaviour when set to false if you don't want that behaviour to also happen by default. Also note that if a scalar message field is set to its default, the value will not be serialized on the wire.

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

相关文章:

c++ - 使用未引用的局部变量警告捕获异常

c++ - 如何在多线程中使用QTcpSocket?

java - 如何在 Java 中获取 protobuf 重复字段构建器?

c++ - Qt GUI 应用程序在与 gui 交互时停止实时进程

c++ - 僵尸进程无法通过 waitpid 调用进行清理

c++ - C++ 中的 XML 序列化/反序列化

java - 如何从数据库转换为列表序列化

java - 通过 UDP 将 C 结构转换为 Java 对象

Java Protocol Buffer - 反射

c++ - 找不到 Protocol Buffer 生成命令 libprotobuf.dll.a