我们是否应该在可选的protobuf字段中设置默认值以最小化通过线路发送的数据? 我想最小化通过线路发送的消息字节大小.为实现这一目标,我能想到的一个优化是: if( message-my_optional_
我想最小化通过线路发送的消息字节大小.为实现这一目标,我能想到的一个优化是:
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下,“存在”的概念与默认值的概念是分开的.在proto2中将字段设置为其默认值与清除它不同;即使它是默认值,该值也将通过网络发送.在proto2中,为了“取消”字段,你必须调用clear_my_optional_field();然后它不会在电线上发送. Proto3还有单独的has_my_optional_field()方法来检查字段是否已设置.
在proto3下,“存在”的概念已被删除.相反,当且仅当字段未设置为默认值时,才会发送字段. clear_方法与设置为默认值相同. has_方法不再存在.此外,proto3取消了可配置默认值的概念 – 所有字段的默认值为0或空.
例外:对于消息类型字段,proto3中的行为没有改变.这些领域仍然存在存在的概念.