不要在可选的 protobuf 字段中设置默认值,以尽量减少通过线路发送的数据

Do not set default values in optional protobuf fields to minimize data sent over the wire

我们不应该在可选的 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 下,"is present" 的概念与默认值的概念是分开的。在 proto2 中将一个字段设置为其默认值与清除它是 而不是 一样;该值将通过网络发送,即使它是默认值。在 proto2 中,为了 "unset" 您必须调用 clear_my_optional_field() 的字段;那么它就不会通过网络发送。 Proto3 也有单独的 has_my_optional_field() 方法来检查字段是否已设置。

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

异常:对于消息类型的字段,proto3 中的行为没有改变。这些字段还是存在的概念。

不知道这是否有用,但如果您使用以下内容,您将有效地获得了解其设置的能力,因此如果发送的值是默认值,它知道输出它,因为它可以告诉它被设置为数据类型。

oneof oneofname{
    int32 variablename = 2;/* the number is the field position within the existing message your declaring the oneof./*
}