在 protobuf 文档中指出:
如果操作不当,删除字段可能会导致严重问题。
当您不再需要某个字段并且所有引用都已从客户端代码中删除时,您可以从消息中删除该字段定义。但是,您必须保留已删除的字段编号。如果您不保留字段编号,开发人员将来可以重复使用该编号。
我不明白的是,我使用 protobuf 编码在客户端和服务器之间进行通信。因此,客户端使用protobuf对数据进行编码,通过网络发送请求,服务器使用protobuf对请求正文进行解码,并执行一些业务逻辑。并且客户端是唯一与该服务器通信的客户端,因此不会有该服务器的消费者,因为该服务器可能已过时。每当服务器消息更新时,客户端自然会始终是最新的。
考虑到上述所有内容,为什么删除字段或重新排序消息的字段编号以及为客户端和服务器生成新的原始消息会导致任何问题?
[...] 客户端是唯一与之通信的客户端 服务器,因此该服务器不会有消费者,这可能是 过时的。每当服务器消息更新时,客户端自然会 始终保持最新状态。
如果你假设这一点,你基本上可以在任何编码中做任何你喜欢的事情。
不幸的是,大多数时候它都是错误的。你只需要回滚一个有故障的客户端或服务器,或者更新客户端和服务器有一个微小的时间差(因为服务器仍在终止,而客户端已经是新的),并且你处于客户端和服务器版本不同的情况不匹配。
Protocol Buffers 的优点之一是,只要遵循一些简单的规则,就可以自由地向后和向前兼容。