Protocol buffers 不要在可选protobuf字段中设置默认值,以最小化通过导线发送的数据

Protocol buffers 不要在可选protobuf字段中设置默认值,以最小化通过导线发送的数据,protocol-buffers,Protocol Buffers,我们是否应该在可选protobuf字段中设置默认值以最小化通过线路发送的数据 我想最小化通过网络发送的消息字节大小。为了实现这一点,我可以想到的一个优化是: if( message->my_optional_field() != value ) message->set_my_optional_field(value); 这可以防止在预期值等于默认值时调用的\u my\u optional\u field(),从而防止该字段出现在序列化数组中。这是一种好的做法吗?protobu

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

我想最小化通过网络发送的消息字节大小。为了实现这一点,我可以想到的一个优化是:

if( message->my_optional_field() != value )
  message->set_my_optional_field(value);
这可以防止在预期值等于默认值时调用
的\u my\u optional\u field()
,从而防止该字段出现在序列化数组中。这是一种好的做法吗?protobuf是否提供了这样的现成功能

这个问题类似于
事实上,这一问题已在对公认答案的评论中得到了回答。然而,随后的评论对这一说法提出了质疑。

proto2和proto3的行为有所不同

在proto2下,“存在”的概念与默认值的概念是分开的。在proto2中将字段设置为其默认值与清除字段不同;即使是默认值,该值也将通过导线发送。在proto2中,为了“取消设置”字段,必须调用
clear_my_optional_field()
;那么它就不会通过电线发送。Proto3还具有单独的
has\u my\u optional\u field()
方法来检查字段是否已设置

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


例外:对于消息类型字段,proto3中的行为没有更改。这些字段仍然有一个存在的概念。

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

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

真有趣。为什么他们放弃了可配置默认值的概念?这听起来像是倒退了一步。@MukulGupta AFAICT,他们希望Protobufs只是Go中的原始结构,而Go没有构造函数;它初始化了一切。所以他们改变了protobuf。摇尾狗IMO。消息中的所有子字段都设置为默认值的mesage类型会发生什么情况?接收方对消息类型调用的HasField是否仍返回True?(如果未设置子字段,则HasField将返回false?)