当前位置: 首页 > 知识库问答 >
问题:

将proto字段更改为“repeated”时,我是否确实需要更改关联的编号?

段干玺
2023-03-14

假设我有一条消息

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

并且我想将baz更改为重复字符串。我真的必须更改数字吗?(例如为4和不建议使用3)。

我和一个朋友正在讨论这个问题。他在Protobuff方面更有经验(我是新手),但从我阅读的文档来看,我实际上不明白为什么有必要这样做。

虽然这些文件没有直接解决我所看到的问题,但我的理由如下:

上述内容可能会序列化为

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

反序列化基本上可以理解为

  • 哦,好的,那是1,所以读取接下来的32位
  • 哦,好的,那是3,所以把接下来的位读成utf-8
  • 嗯,下一个是2,所以把下一个32读成那个

因此,根据文档,当您添加重复时:

在格式良好的消息中,此字段可以重复任意次数(包括零次)

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

这个逻辑正确吗?我能继续用同一个号码吗?还是我遗漏了什么?

共有1个答案

隆璞
2023-03-14

从语言指南:

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

(协议2:https://developers.google.com/protocol-buffers/docs/proto#updating)

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

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

 类似资料:
  • 例如,如果我从以下更改: 到 将foo从1更改为2安全吗?文档说不要:<代码>这些数字用于标识消息二进制格式中的字段,并且在使用消息类型时不应更改 ,但我想知道为什么。

  • 我正在参加在线android工作室课程,我坚持这项任务。 将RecyclerView的layoutManager属性更改为GridLayoutManager https://github.com/google-developer-training/android-basics-kotlin-affirmations-app-solution

  • 问题内容: Mysql,检查字段值是否更改?如果更改值,则显示不同的值 table:一个 在此查询数据之类的。 大小更改时,我需要更改索引。我想获取此类数据。喜欢。 问题答案: 这应该可以解决问题: 输出: 在这里摆弄。

  • 我有以下信息: 我希望将权重和override_weight(可选字段)的类型更改为,因此我所做的是流动: 我的问题是,假设我有以前的protobuff消息编译器为旧消息编译的旧消息,我能将它们解析为新消息吗?文件对此非常模糊: “将可选字段移入或移出其中一个:消息序列化和分析后,您可能会丢失一些信息(某些字段将被清除)。但是,您可以安全地将单个字段移入新字段中,并且如果已知只设置了一个字段,则可

  • 我有两个实体具有@OneTomany(Entity1)&@ManyToOne(Entity2)双向关系。在@OneTomany关系中,我有@Cascading{Cascade.All}。但是当我在事务或方法中将具有@ManyToOne关系的实体的初始为false的boolean属性更改为true,然后又变回false时,它会导致数据库触发更新查询,将实体的boolean设置为false,这似乎是错

  • 我正在使用Android MVVM架构和LiveData。我有一个这样的物体 我的视图模型是这样的 如何确保用户对象中的某个字段发生更改时,观察员收到通知?顺便说一句,重要的是要将这些数据保存在单独的对象中,而不是在ViewModel中使用字符串等主要值。