让我说一条信息
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)
反序列化基本上会将其读取为
根据文档,当您添加repeated
时:
此字段可以在格式正确的消息中重复任意次(包括零次)
告诉我,遇到3
时读取的实际位数不会有任何不同,我们可能会遇到多个三位。因此,它在序列化和反序列化时是验证,但实际上不是编码的一部分。
这种逻辑正确吗?我可以继续使用相同的号码吗?还是我错过了什么?
答案 0 :(得分:1)
来自语言指南:
可选与重复兼容。给定重复字段的序列化数据作为输入,如果期望此字段是可选的,则如果它是原始类型字段,则客户端将采用最后一个输入值;如果是消息类型字段,则将合并所有输入元素。
(proto2:https://developers.google.com/protocol-buffers/docs/proto#updating)
这对proto2有效,我想说即使没有指定,它仍然适用于proto3。行为应该是遗留代码将处理该列表并将最后读取的值保存在内存中。
将字段从可选更改为重复时,我还要注意API的更改。这也许是您的朋友想要强调的。