跨版本运行时保证

该语言对跨版本运行时兼容性的保证。

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.23.20.33.21.63.21.7
运行时
版本
3.20.2漏洞无法运行漏洞无法运行
3.20.3漏洞正常工作漏洞正常工作?
3.21.6漏洞无法运行漏洞无法运行
3.21.7漏洞正常工作漏洞正常工作
  • “漏洞”表示组合将成功启动,但安全漏洞仍然存在。
  • “正常工作”表示组合将成功启动,并且没有漏洞。
  • “无法运行”表示组合将无法成功启动。
  • 粗体表示根据本主题中概述的保证,从未有意使这些配置一起运行。

不支持多个主要运行时版本共存

支持在同一进程中多个主要版本共存。

C++ 特定保证

Protobuf C++ 声明不提供任何跨运行时支持,并且始终要求其生成的代码版本与其运行时版本完全匹配。 此外,Protobuf C++ 不对任何版本(主要版本、次要版本或微版本)之间的 ABI 稳定性做任何保证。