protocol-buffers - 我可以更改原始文件中的编号标签吗?

标签 protocol-buffers grpc

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

同样的例子,说这是原始数据

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

我想添加一个新字段,从逻辑上讲,将其放在分页字段之前是有意义的 - 如果我不使用 page_number,我可以按如下方式重新枚举字段吗?和result_per_page字段尚未(尽管消息类型 SearchRequest 正在使用中)?

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

我是否应该从一开始就为分页字段指定更高的数字以允许新字段?

documentation

These field numbers are used to identify your fields in the message binary format, and should not be changed once your message type is in use.

最佳答案

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

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

关于protocol-buffers - 我可以更改原始文件中的编号标签吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66642064/

相关文章:

java - Protocol Buffer 比序列化更好?

java - 计算 Protocol Buffer 文件中的消息数

json - gRPC 服务器可以作为另一个 gRPC 客户端的客户端吗?

Docker:如何从给定容器访问另一个容器中的文件?

java - gRPC-java 服务器在负载下处理请求和发送响应的延迟

c++ - 使用 Protocol Buffer 连接 C# 和 C++

c++ - 在 64 位应用程序中编码 protobuf 消息并在 32 位应用程序中解码是否有效?

gradle - 带有 Gradle 的 RSocket RPC (Windows) 二进制文件(Bluild 失败)

c# - 为 gRPC 客户端创建接口(interface)以进行单元测试

macos - “BloomRPC” 无法打开,因为无法验证开发者