跨版本运行时保证
Protobuf 语言绑定有两个组件。生成的代码(通常由 protoc
生成)和使用生成的代码时必须包含的运行时库。当它们来自不同版本的 protobuf 时,我们就处于“跨版本运行时”的情况。
我们计划在除 C++ 之外的所有语言中提供以下保证。 这些是默认保证;但是,protobuf 代码生成器和运行时的所有者可以显式地为该语言覆盖它们,提供更具体的保证。
超出保证范围的 Protobuf 跨版本使用是容易出错且不受支持的。版本偏差可能导致不稳定的和未定义的行为,即使在源不兼容的方式中没有发生任何更改,它通常似乎可以工作,但这些行为也很难诊断。对于 Protobuf 而言,依赖于使用不受支持的 Protobuf 语言绑定的工具和服务的激增,阻止了 protobuf 团队响应错误报告或安全漏洞来更新 protobuf 实现。
新 Gencode + 旧运行时 = 永远不允许
我们可能会在任何类型的版本(主要版本、次要版本或补丁版本)中添加新的运行时 API。 该版本中的 Gencode 允许使用这些新的 API。 结果是,gencode 绝不应与早于用于生成这些绑定的 protoc
和插件的运行时配对。
我们将在可能的情况下添加“毒丸”以防止尝试将较新的 gencode 与较旧的运行时配对。
主要版本
从 2025 年第一季度版本开始,protobuf 项目将对主要版本采用滚动兼容性窗口。 为主要版本 V(完整版本:V.x.y)生成的代码将受版本 V 和 V+1 的 protobuf 运行时支持。
在此策略之前,为 3.22.x+(版本大约在主要版本 4 之前 1 年发布)生成的代码仍将受版本 3 和 4 的 protobuf 运行时支持。使用旧 gencode 的用户应升级到 3.25.x 的最新 gencode。
Protobuf 将不支持将版本 V 的 gencode 与运行时 >= V+2 一起使用,并且将使用“毒丸”机制,当软件程序集尝试使用此类配置时,会显示清晰的错误消息。
次要版本
在单个主要运行时版本中,来自旧版本 protoc
的生成代码将在较新的运行时上运行。
安全例外
如果出于安全原因需要,我们保留违反上述承诺的权利。 我们预计这些例外情况很少见,但始终会将安全性置于这些保证之上。 例如,footmitten 需要对 Java 的运行时和生成的代码进行配对更新。 因此,由 3.20.3(包含 footmitten 修复)生成的代码将无法与 3.21.6(早于 footmitten 修复)运行时库一起加载,从而创建以下兼容性矩阵。
生成代码版本 | |||||
3.20.2 | 3.20.3 | 3.21.6 | 3.21.7 | ||
运行时 版本 | 3.20.2 | 漏洞 | 无法运行 | 漏洞 | 无法运行 |
3.20.3 | 漏洞 | 正常工作 | 漏洞 | 正常工作? | |
3.21.6 | 漏洞 | 无法运行 | 漏洞 | 无法运行 | |
3.21.7 | 漏洞 | 正常工作 | 漏洞 | 正常工作 |
- “漏洞”表示组合将成功启动,但安全漏洞仍然存在。
- “正常工作”表示组合将成功启动,并且没有漏洞。
- “无法运行”表示组合将无法成功启动。
- 粗体表示根据本主题中概述的保证,从未有意使这些配置一起运行。
不支持多个主要运行时版本共存
不支持在同一进程中多个主要版本共存。
C++ 特定保证
Protobuf C++ 声明不提供任何跨运行时支持,并且始终要求其生成的代码版本与其运行时版本完全匹配。 此外,Protobuf C++ 不对任何版本(主要版本、次要版本或微版本)之间的 ABI 稳定性做任何保证。