不要在可选的protobuf字段中设置默认值,以最大限度地减少通过线路发送的数据

Muk*_*pta 8 protocol-buffers

我们是否应该在可选的protobuf字段中设置默认值以最小化通过线路发送的数据?

我想最小化通过线路发送的消息字节大小.为实现这一目标,我能想到的一个优化是:

if( message->my_optional_field() != value )
  message->set_my_optional_field(value);
Run Code Online (Sandbox Code Playgroud)

这可以防止has_my_optional_field()在预期值等于默认值时调用,从而防止该字段出现在序列化数组中.这是一个好习惯吗?protobuf能提供开箱即用的东西吗?

问题类似于has_field()方法如何与protobuf中的默认值相关联? 事实上,已经在一个评论中回答了已接受的答案.但是,随后的评论对此声称提出异议.

Ken*_*rda 11

proto2和proto3之间的行为不同.

在proto2下,"存在"的概念与默认值的概念是分开的.一个字段设置为在proto2它的默认值是一样的将其清除; 即使它是默认值,该值也将通过网络发送.在proto2中,为了"取消"你必须调用的字段clear_my_optional_field(); 然后它不会在电线上发送.Proto3也有单独的has_my_optional_field()方法来检查字段是否已设置.

在proto3下,"存在"的概念已被删除.相反,当且仅当字段未设置为默认值时,才会发送字段.该clear_方法与设置为默认值相同.该has_方法不再存在.此外,proto3取消了可配置默认值的概念 - 所有字段的默认值为0或空.

例外:对于消息类型的字段,proto3中的行为没有改变.这些领域仍然存在存在的概念.

  • @MukulGupta AFAICT,他们希望Protobufs只是Go中的原始结构,Go没有构造函数; 它零初始化一切.所以他们改变了protobuf.尾巴摇着狗IMO. (4认同)
  • 有趣的是.他们为什么要废除可配置默认值的概念?这听起来像倒退了一步. (3认同)