将原始字段更改为“重复”时,我是否真的需要更改相关编号?

时间:2019-05-05 18:55:11

标签: serialization protocol-buffers proto

让我说一条信息

message Something {
  int32 foo = 1;
  int32 bar = 2;
  string baz = 3;
}

,我想将baz更改为repeated string。我真的需要更改电话号码吗? (例如,设置为4并弃用3)。

我和一个朋友正在辩论这个问题。他在probbuff方面经验丰富(我是新手),但从我对the docs的阅读中,我实际上不明白为什么需要这样做。

虽然文档并未直接解决我所看到的问题,但我的理由如下:

以上内容可能会序列化为类似

0001(32bits)0011(utf-8bits)0010(32bits)

反序列化基本上会将其读取为

  • 好的,那是1,所以请阅读接下来的32位
  • 好吧,那是3,所以接下来读为utf-8
  • 嗯,下一个是2,所以再读下32个

根据文档,当您添加repeated时:

  

此字段可以在格式正确的消息中重复任意次(包括零次)

告诉我,遇到3时读取的实际位数不会有任何不同,我们可能会遇到多个三位。因此,它在序列化和反序列化时是验证,但实际上不是编码的一部分。

这种逻辑正确吗?我可以继续使用相同的号码吗?还是我错过了什么?

1 个答案:

答案 0 :(得分:1)

来自语言指南:

  

可选与重复兼容。给定重复字段的序列化数据作为输入,如果期望此字段是可选的,则如果它是原始类型字段,则客户端将采用最后一个输入值;如果是消息类型字段,则将合并所有输入元素。

(proto2:https://developers.google.com/protocol-buffers/docs/proto#updating

这对proto2有效,我想说即使没有指定,它仍然适用于proto3。行为应该是遗留代码将处理该列表并将最后读取的值保存在内存中。

将字段从可选更改为重复时,我还要注意API的更改。这也许是您的朋友想要强调的。