2015-10-19 1744 views
20

proto2版本的协议缓冲区允许为消息元素指定默认值:为什么proto3中没有自定义的默认值?

optional double scaling_factor = 3 [default = 1.0]; 

为什么proto3这是不再可能?我认为这是一个很好的功能,可以在不需要编写任何包装代码的情况下节省更多的字节。

回答

28

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

(我个人认为,缺乏存取和属性语言不是很好的语言和protobuf的不应该向下的设计给他们,但它不是我的项目了。)

+0

看起来很惭愧,他们不能简单地检测网络上的现场存在,并在缺失时应用合同默认值。这本身应该是语言不可知的。 –

+2

@MeirionHughes - 我相信问题出现在实例化一个新的对象,而不是电线。如果你的语言没有提供构造器的概念,也没有提供访问器的概念,那么你不能将字段初始化为默认值,而不依赖于序列化。 –

+0

但是,当然你可以简单地分配施工后的结构域?我想不出任何理智的原因,为什么你会有一种定义不可初始化,不可变的结构的语言... –

0

在我的自动生成的文件.pb.cc我看到这样几个地方:

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

,很少像这样:

myint_ = 0; 

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

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

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

... 
myint_ = myint_defaultvalue; 
... 

改为?

相关问题