为什么proto3中没有自定义默认值?

时间:2015-10-19 19:40:07

标签: protocol-buffers proto3

协议缓冲区的 proto2 版本允许为消息元素指定默认值:

optional double scaling_factor = 3 [default = 1.0];

为什么 proto3 不再可能?我认为这是一个简洁的功能,可以在线上保存额外的字节,而无需编写任何包装代码。

3 个答案:

答案 0 :(得分:41)

我的理解是proto3不再允许你检测字段存在而不再支持非零默认值,因为这样可以更容易地用各种语言的“普通旧结构”实现protobufs,而无需生成存取方法。这被认为使Protobuf更容易在这些语言中使用。

(我个人认为缺乏访问者和属性的语言不是很好的语言,protobuf不应该设计它们,但它不再是我的项目了。)

答案 1 :(得分:1)

在我自动生成的文件.pb.cc中,我看到很少这样的地方:

if (this->myint() != 0) {

,很少有人喜欢这样:

myint_ = 0;

那么,为什么不启用默认值并生成

static ::google::protobuf::int32 myint_defaultvalue = 5;

...
if (this->myint() != myint_defaultvalue) {
...

...
myint_ = myint_defaultvalue;
...

代替?

答案 2 :(得分:0)

这是一种变通方法,而不是您问题的直接答案,但是我发现自己使用wrappers.proto可选值,然后在绝对必须知道这是默认值还是一个程序时,以编程方式自行设置了默认值明确设置的值。

代码不是必须强制执行值而不是生成的代码本身不是最佳选择,但是如果双方都拥有,至少是一个可行的选择,而不是不知道值是默认值还是显式设置值,尤其是看着布尔值设置为false时。

我不清楚这将如何影响网络上的字节。对于我使用过的实例,消息长度不是设计约束。

原始文件

import "google/protobuf/wrappers.proto";

google.protobuf.BoolValue optional_bool = 1;

Java代码

//load or receive message here
if( !message.hasOptionalBool() )
    message.setOptionalBool( BoolValue.newBuilder().setValue( true ) );