当前位置 : 主页 > 大数据 > 区块链 >

protocol-buffers – 不要在可选的protobuf字段中设置默认值,以最大限度地减少通过线

来源:互联网 收集:自由互联 发布时间:2021-06-22
我们是否应该在可选的protobuf字段中设置默认值以最小化通过线路发送的数据? 我想最小化通过线路发送的消息字节大小.为实现这一目标,我能想到的一个优化是: if( message-my_optional_
我们是否应该在可选的protobuf字段中设置默认值以最小化通过线路发送的数据?

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

if( message->my_optional_field() != value )
  message->set_my_optional_field(value);

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

问题类似于how do has_field() methods relate to default values in protobuf?
事实上,已经在其中一条评论中回答了已接受的答案.但是,后来的评论对这一说法提出异议.

proto2和proto3之间的行为不同.

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

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

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

网友评论