63

Protocol Buffers的proto2版本允许为消息元素指定默认值:

optional double scaling_factor = 3 [default = 1.0];

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

4

3 回答 3

88

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

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

于 2015-10-20T05:54:23.113 回答
5

这是一种解决方法,而不是直接回答您的问题,但是我发现自己使用 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 ) );
于 2019-03-28T16:12:57.257 回答
4

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

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

很少有人像这样:

myint_ = 0;

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

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

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

...
myint_ = myint_defaultvalue;
...

反而?

于 2015-11-08T17:34:43.003 回答