【发布时间】: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_string和normal_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