Flo*_*ers 6 c++ serialization protocol-buffers
我目前正在使用Google Protocol Buffers的 v3.0.0-alpha-2 .
据我所知,v3删除了required关键字,extensions
字段的关键字和默认值,以简化原型语言.
我不明白的是optionalproto3中关键字的含义.
例:
syntax = "proto3";
package fw.example;
message ExampleMessage {
optional string optional_string = 1;
string normal_string = 2;
}
Run Code Online (Sandbox Code Playgroud)
问:是什么区别optional_string和normal_string
除了名称和标记?
我已经阅读了以下资源(它们似乎是protobuf v3的唯一公开版本):
但他们甚至没有提到optional关键字.
optional在proto3过时,因为现场始终是可选的?required?似乎在proto3中,人们不能再将未设置的字段和客户端设置的字段区分为(隐式)默认值.
最好的做法是将每个proto3消息包装在特定于语言的类中吗?我正在使用C++,我需要确保设置特定的字段.与proto2相比,现在似乎必须在语言特定的源代码中手动完成验证.
有人可以启发我,对proto3消息应用约束但允许方案演变的最佳方法是什么?目前我认为必须围绕proto3消息编写新的API,以便客户端不直接处理proto3生成的代码,而是使用自定义API代码.那是对的吗?
也许有人可以给我一个具体的例子来讨论.
我很困惑,因为v3的发行说明中说明了以下内容:
我们建议新的Protocol Buffers用户使用proto3.但是,由于API不兼容,我们通常不建议现有用户从proto3迁移proto2,并且我们将继续支持proto2很长一段时间.
如果proto3是要走的路,为什么事情变得复杂?在我看来,我现在需要编写比proto2更多的代码.
我的推理如下:
既然required已经过时了,那么一切都是optional.因此没有明确关键字的原因.
语言指南中的以下段落指示如果未设置值,如何初始化值:
请注意,对于标量消息字段,一旦解析了消息,就无法确定字段是否显式设置为默认值(例如,布尔值是否设置为false)或者根本没有设置:您应该承担这一点在定义消息类型时要注意.
所以optional真的意味着"如果你没有明确地设置它,我们会为你设置它的默认值!"
请注意,这允许他们进行一些很好的优化(如果将其设置为默认值,则不包括线上的值):
例如,如果您不希望默认情况下也发生这种行为,那么当设置为false时,没有一个布尔值可以打开某些行为.另请注意,如果标量消息字段设置为其默认值,则该值不会在线路上序列化.
| 归档时间: |
|
| 查看次数: |
6946 次 |
| 最近记录: |