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

我可以更改proto文件中的编号标记吗?

楚俊逸
2023-03-14

这篇文章描述了原始文件中编号标签的用途,在序列化和反序列化数据时基本上匹配字段。我的问题是:如果我更改现有字段的编号会发生什么?

举同样的例子,假设这是原始数据

message SearchRequest {
  required string query = 1;
  // Pagination fields
  optional int32 page_number = 2;
  optional int32 result_per_page = 3;
}

我想添加一个新字段,在分页字段之前添加这个字段在逻辑上是有意义的-如果我还没有使用页码每页结果字段(尽管消息类型搜索请求正在使用),我可以按如下方式重新枚举字段吗?

message SearchRequest {
  required string query = 1;
  optional int32 new_data = 2;
  // Pagination fields
  optional int32 page_number = 3;
  optional int32 result_per_page = 4;
}

我是否应该从一开始就给分页字段更大的数字,以允许新字段?

留档说

这些字段编号用于标识消息二进制格式中的字段,并且在使用消息类型后不应更改。


共有1个答案

钱振
2023-03-14

更改字段编号几乎总是一个坏主意——除非所有客户端和服务器同时are.deployed,并且任何地方(文件、数据库等)都没有持久的有效负载数据,否则您会得到非常奇怪的行为。特别是,序列化程序会尝试将数据解释为不同的东西:在某些情况下,这会导致序列化失败,在其他情况下,它会默默地愉快地反序列化具有垃圾含义的数据,从而导致混乱。

没有理由不简单地使用字段5。

 类似资料:
  • 我有这样一个gRPC API定义(来自Akka docs示例),但要长得多(4000行,仅是服务部分)。 然而,RPC列表现在变得太长了,我想以某种方式将其“分解”为多个文件,以便文件更具可读性。像这样的 即使只是在不同的文件中分别定义RPC,然后编写类似的内容也会对我有所帮助: 是否有可能在gRPC协议定义中以某种方式“组合”服务?

  • 我可以使用PHP以编程方式更改文件的路径吗? 例如,更改

  • 问题内容: 我有一个计划用于废料堆的旧可执行文件,但是还不存在。它依赖于已经从我的环境中删除的一些库,但是我在某些可以正常工作的地方有一些存根库。我想将此可执行文件指向这些存根库。是的,我可以设置LD_LIBRARY_PATH,但是许多脚本都调用了此可执行文件,许多用户也希望将其修复在一处。 我没有这个来源,很难得到它。我在想- 是否可以使用支持ELF的编辑器编辑此文件,并向rpath添加一个简单

  • 如何使用JavaScript更改标记的属性? 起初,我有一个默认的src是“../template/edit.png”,我想用“../template/save.png”onclick更改它。 更新:这里是我的html onclick: 和我的JS 我试着在edit()中插入它,它可以工作,但需要单击图像两次

  • 假设我有一条消息 并且我想将更改为。我真的必须更改数字吗?(例如为4和不建议使用3)。 我和一个朋友正在讨论这个问题。他在Protobuff方面更有经验(我是新手),但从我阅读的文档来看,我实际上不明白为什么有必要这样做。 虽然这些文件没有直接解决我所看到的问题,但我的理由如下: 上述内容可能会序列化为 反序列化基本上可以理解为 哦,好的,那是1,所以读取接下来的32位 哦,好的,那是3,所以把接

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