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;
}
我是否应该从一开始就为分页字段指定更高的数字以允许新字段?
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/