protocol-buffers - 我可以停用必需的 protobuf 字段吗?

标签 protocol-buffers backwards-compatibility

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

如果我换一个 required字段为 optional ,但仅限于对消息进行序列化的代码(即反序列化代码没有重新构建,仍然认为是required字段),是否可以继续发布可以反序列化的消息只要我为现在填充一个值- optional field ?

(这样做似乎很好,至少对于我尝试过的一些琐碎案例(仅使用 Java),但我感兴趣的是它是否是一种普遍合理的方法,以及是否存在任何边缘案例等我应该担心)。

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

  • 更改 required字段到 optional在行李箱上。
  • 如果需要部署新的服务器代码(对于不相关的功能/修复),请确保在消息中继续填充可选字段。
  • 为所有客户逐步部署更新的代码(这需要时间,因为它需要其他团队参与他们自己的发布计划)
  • 确认所有客户端都已更新。
  • 开始停用(即不填充)可选字段。
  • 最佳答案

    根据encoding format documentation ,无论是否需要字段都不会在序列化字节流本身中进行编码。即 optionalrequired在编码的序列化消息中没有区别 .

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

    关于protocol-buffers - 我可以停用必需的 protobuf 字段吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13675590/

    相关文章:

    c# - Protobuf-net 使用接口(interface)和抽象基类创建类型模型

    c - 从私有(private)函数中删除 `static` 会破坏 ABI 兼容性吗?

    objective-c - Mac OS X App 在使用 NSPopovers 时向后兼容 10.6 和 10.7

    c++ - std::vector、默认构造、C++11 和重大更改

    升级到icefaces 1.7.2后出现javax.faces.application.ViewExpiredException

    Android:如何为智能手机和平板电脑设计应用程序?

    javascript - 处理具有重复字段的消息

    docker-compose - 在 docker 中共享 proto 文件?

    java - 包 org.apache.hadoop.ipc.protobuf 为空

    c++ - 如何在 Protobuf 中声明 unsigned long long?