我可以退出所需的protobuf字段吗?

bac*_*car 13 backwards-compatibility protocol-buffers

我有一个客户端 - 服务器应用程序,其中服务器将protobuf格式的序列化对象传输到客户端,我想退出一个required字段.不幸的是,我无法同时更改客户端和服务器以使用新.proto定义.

如果我更改一个required字段optional,但仅用于序列化消息的代码(即反序列化代码尚未重建并仍然认为它是一个required字段),我可以继续发布可以反序列化的消息,只要我填充一个值为现在optional

(看起来这样做很好,至少对于我尝试过的一些微不足道的案例(仅使用Java),但我很感兴趣,如果这是一个普遍合理的方法,是否有任何边缘情况等我应该担心).

动机:我的目标是required在客户端 - 服务器应用程序中淘汰字段,其中服务器发布由客户端反序列化的消息.我的打算是:

  1. required字段更改optional为主干.
  2. 如果需要部署新的服务器代码(针对不相关的功能/修复),请确保在消息中继续填充可选字段.
  3. 逐步为所有客户端部署更新的代码(这需要时间,因为它需要其他团队参与其自己的发布计划)
  4. 确认所有客户端都已更新.
  5. 开始退出(即不填充)可选字段.

bac*_*car 20

根据编码格式文档,是否需要字段不是在串行化字节流本身中编码的.也就是说,编码的序列化消息optionalrequired没有区别.

我已经在实践中证实了这一点,使用Java生成的代码,通过将序列化消息写入磁盘并比较输出 - 使用包含所有支持的基元类型的消息以及表示其他类型的字段.