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

Protocol buffers 为什么proto3中没有自定义默认值?,protocol-buffers,proto3,Protocol Buffers,Proto3,协议缓冲区的协议2版本允许为消息元素指定默认值: optional double scaling_factor = 3 [default = 1.0]; 为什么这在proto3中不再可能?我认为这是一个整洁的特性,可以在不需要编写任何包装代码的情况下在电线上保存额外的字节。 < P>我的理解是,Prime3不再允许您检测字段存在,并且不再支持非零默认值,因为这使得在各种语言中用“简单的老结构”更容易实现原型BuffFS。无需生成访问器方法。这被认为是使Protobuf更容易在这些语言中使用 (

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

optional double scaling_factor = 3 [default = 1.0];

为什么这在proto3中不再可能?我认为这是一个整洁的特性,可以在不需要编写任何包装代码的情况下在电线上保存额外的字节。

< P>我的理解是,Prime3不再允许您检测字段存在,并且不再支持非零默认值,因为这使得在各种语言中用“简单的老结构”更容易实现原型BuffFS。无需生成访问器方法。这被认为是使Protobuf更容易在这些语言中使用


(我个人认为缺少访问器和属性的语言不是很好的语言,protobuf不应该设计成这样,但这不再是我的项目。)

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

if (this->myint() != 0) {
myint_ = 0;
很少有人会这样:

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

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

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

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

...
myint_ = myint_defaultvalue;
...

相反?

这是一种变通方法,而不是直接回答您的问题,但我发现自己使用wrappers.proto可选值,然后自己编程设置默认值,而我绝对必须知道这是默认值还是显式设置的值

您的代码必须强制执行值而不是生成的代码本身,这不是最佳选择,但如果您同时拥有这两个方面,那么至少这是一个可行的选择,而不是不知道值是默认值还是显式值集,特别是当查看设置为false的bool时

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

原始文件

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 ) );

看起来很遗憾,他们不能简单地检测线路上的现场存在,并在缺失时应用合同默认值。这本身应该是语言不可知的。@MeirionHughes-我相信问题是在实例化一个新对象时出现的,而不是离线的。如果您的语言不提供构造函数和访问器的概念,那么您就不能将字段初始化为默认值,而不依赖于序列化。但是,您肯定可以在构造之后简单地分配struct字段吗?我想不出任何合理的理由来解释为什么你会有一种定义不可初始化、不可变结构的语言…@MeirionHughes当然,但默认值的全部要点是它应该自动设置。如果您没有构造函数,那么在应用程序代码中分配对象时,就无法自动初始化对象;应用程序代码作者需要始终手动调用一些初始化函数。很可能,人们会忘记。打破向后兼容性以避免在某些语言中使用对象工厂似乎有些奇怪。。。即便如此,“默认”指令也是合同的一个特征;因为它只与电线运输有关。如果POCO对象字段与合同默认值不同,那么这些字段将被发送出去。由于您总是使用库进行反序列化,因此库本身可以轻松地将缺少的字段初始化为合同默认值。无论如何,我不会再对比我更了解这件事的人说教了