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

时间:2012-12-03 00:28:40

标签: protocol-buffers backwards-compatibility

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

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

(看起来这样做很好,至少对于我试验过的一些小事(只使用Java),但我感兴趣的是它是否是一种普遍合理的方法,以及是否有任何边缘情况等我应该担心)。

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

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

2 个答案:

答案 0 :(得分:20)

根据encoding format documentation,是否需要字段不是在串行化字节流本身中编码的。也就是说, optionalrequired在编码的序列化邮件中没有区别

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

答案 1 :(得分:3)

只要设置了字段,使用parseFrom(byte[])方法进行反序列化仍然有效,因为byte []将是相同的。

然而,有人会想知道为什么你要将字段从必需更改为可选字段,直到你准备允许它是可选的?基本上你只是在.proto文件中使它成为“可选”,但你强制要求总是填充它。只是一个想法。