跨版本运行时保证

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

Protobuf 语言绑定有两个组件。生成的代码(通常由 protoc 生成)以及使用生成代码时必须包含的运行时库。当这些来自不同版本的 protobuf 时,我们就处于“跨版本运行时”的情况。

我们打算为除 C++ 之外的所有语言提供以下保证。这些是默认保证;但是,protobuf 代码生成器和运行时的所有者可以明确地覆盖它们,为该语言提供更具体的保证。

在保证范围之外的 Protobuf 跨版本使用容易出错且不受支持。版本偏差可能导致难以诊断的错误和未定义行为,即使它通常似乎可以工作,只要没有以源代码不兼容的方式发生任何更改。对于 Protobuf,依赖于使用不受支持的 Protobuf 语言绑定的工具和服务的激增,阻止了 protobuf 团队根据错误报告或安全漏洞更新 protobuf 实现。

新 Gencode + 旧运行时 = 永不允许

我们可以在任何类型的版本(主版本、次版本或补丁版本)中添加新的运行时 API。该版本中的 Gencode 允许使用这些新的 API。结果是,gencode 永远不应该与早于用于生成这些绑定的 protoc 和插件的运行时配对。

我们将尽可能添加“毒丸”,以防止尝试将较新的 gencode 与较旧的运行时配对。

主版本

从 2025Q1 版本开始,protobuf 项目将为主要版本采用滚动兼容窗口。为主要版本 V(完整版本:V.x.y)生成的代码将受版本 V 和 V+1 的 protobuf 运行时支持。

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 稳定性不作任何保证。