2024 年 10 月 2 日宣布的变更

2024 年 10 月 2 日宣布的 Protocol Buffers 变更。

以下各节介绍了计划在 v30 版本中进行的重大变更,预计发布时间为 2025 年第一季度。这些描述是我们预期的变更实现方式,但由于软件的灵活性,其中一些变更可能不会落地,或者可能与本主题中的描述有所不同。

C++ 的变更

C++ 的主版本将从 5.29.x 升级到 6.30.x。

描述符 API

v30 将更新描述符(例如 full_name)中的返回类型为 absl::string_view。这可以节省描述符中的内存。

v28 引入了 PROTOBUF_FUTURE_STRING_VIEW_RETURN_TYPE 宏,您可以在此期间使用它来提前启用更新后的返回类型,以应对重大版本发布。v30 版本将反转默认设置并移除该宏。

ctype 从 FieldDescriptor 选项中移除

v30 将停止从 FieldDescriptor 选项中公开 ctype。您可以使用 v28 版本中添加的 FieldDescriptor::cpp_string_type() API 来替代它。

用获取的依赖项替换 CMake 子模块

v30 将移除子模块,并切换到 upb 旧的获取依赖项的 CMake 模式。

如果您使用已安装的软件包,则不会受到影响。它可能会破坏某些 CMake 工作流。

移除已弃用的 API

v30 将移除以下公共运行时 API,这些 API 已被标记为已弃用(例如 ABSL_DEPRECATED)至少一个次要或主要版本,并且已过时或被替换。

Arena::CreateMessage

API: Arena::CreateMessage

替代方案: Arena::Create

Arena::GetArena

API: Arena::GetArena

替代方案: value->GetArena()

RepeatedPtrField::ClearedCount

API: RepeatedPtrField::ClearedCount

替代方案: 迁移到 Arenas (迁移指南)。

JsonOptions

API: JsonOptions

替代方案: JsonPrintOptions

放弃对 C++14 的支持

此版本将放弃 C++ 14 作为最低支持版本,并根据基础 C++ 支持矩阵将其提高到 17。

根据我们的政策,我们不认为这是一项重大变更。

JRuby 的变更

v30 将把 JRuby 的默认实现切换到 FFI,这可能会对某些 JRuby 用户造成重大影响。

请注意,此变更不会导致 Ruby 主版本升级,因为 JRuby 并非官方支持

Python 中的变更

Python 的主版本将从 5.29.x 升级到 6.30.x。

放弃对 Python 3.8 的支持

根据我们的官方 Python 支持政策,我们将放弃对 Python 3.8 及更低版本的支持。这意味着最低支持的 Python 版本是 3.9。

移除 bazel/system_python.bzl 别名

v30 将移除旧的 bazel/system_python.bzl 别名。

移除对 system_python.bzl 的直接引用,转而使用 protobuf_deps.bzl。如果需要直接引用,请使用它在 v5.27.0 中移动到的 python/dist/system_python.bzl

字段设置器验证变更

Python 和 upb 的字段设置器将在 v30 中修复,以在 2023 版下验证封闭枚举。使用无效值更新的封闭枚举字段将生成错误。

移除已弃用的 API

v30 将移除以下公共运行时 API,这些 API 已被标记为已弃用至少一个次要或主要版本,并且已过时或被替换。

反射方法

API: reflection.ParseMessage, reflection.MakeClass

替代方案: message_factory.GetMessageClass()

RPC 服务接口

API: service.RpcException, service.Service, service.RpcController, 和 service.RpcChannel

替代方案: 从 2.3.0 版本开始,RPC 实现不应尝试在此基础上构建,而应提供代码生成器插件,以生成特定于特定 RPC 实现的代码。

MessageFactory 和 SymbolDatabase 方法

API: MessageFactory.GetPrototype, MessageFactory.CreatePrototype, MessageFactory.GetMessages, SymbolDatabase.GetPrototype, SymbolDatabase.CreatePrototype, 和 SymbolDatabase.GetMessages

替代方案: message_factory.GetMessageClass()message_factory.GetMessageClassesForFiles()

GetDebugString

API: GetDebugString

替代方案

没有替代方案。它只存在于 Python C++ 中,而该版本已不再发布。纯 Python 或 UPB 不支持它。

Objective-C 中的变更

这将是 Objective-C 的第一个重大版本发布.

Objective-C 的主版本将从 3.x.x 升级到 4.30.x。

彻底修改未知字段处理 API,弃用大部分现有 API

v30 将弃用 GPBUnknownFieldSet 并用 GPBUnknownFields 替换它。新类型将保留来自原始输入或 API 调用的未知字段的顺序,以确保在将消息写回时保留顺序的任何语义含义。

作为此变更的一部分,GPBUnknownField 类型的 API 也发生了变化,几乎所有现有 API 都将被弃用并添加新的 API。

已弃用的属性 API

  • varintList
  • fixed32List
  • fixed64List
  • lengthDelimitedList
  • groupList

已弃用的修改 API

  • addVarint
  • addFixed32
  • addFixed64
  • addLengthDelimited
  • addGroup

已弃用的初始化器 initWithNumber:

新的属性 API

  • type
  • varint
  • fixed32
  • fixed64
  • lengthDelimited
  • group

此类型将在其值中为一个字段编号建模,而不是为给定字段编号的所有值进行分组。用于创建新字段的 API 是 GPBUnknownFields 类上的 add* API。

v30 还将弃用 -[GPBMessage unknownFields]。取而代之的是,将有新的 API 来提取和更新消息的未知字段。

移除已弃用的 API

v30 将移除以下公共运行时 API,这些 API 已被标记为已弃用至少一个次要或主要版本,并且已过时或被替换。

GPBFileDescriptor

API: -[GPBFileDescriptor syntax]

替代方案: 已过时。

GPBMessage mergeFrom:extensionRegistry

API: -[GPBMessage mergeFrom:extensionRegistry:]

替代方案: -[GPBMessage mergeFrom:extensionRegistry:error:]

GPBDuration timeIntervalSince1970

API: -[GPBDuration timeIntervalSince1970]

替代方案: -[GPBDuration timeInterval]

GPBTextFormatForUnknownFieldSet

API: GPBTextFormatForUnknownFieldSet()

替代方案:已过时 - 使用 GPBTextFormatForMessage(),它包含任何未知字段。

GPBUnknownFieldSet

API: GPBUnknownFieldSet

替代方案: GPBUnknownFields

GPBMessage unknownFields

API: GPBMessage unknownFields 属性

替代方案:-[GPBUnknownFields initFromMessage:], -[GPBMessage mergeUnknownFields:extensionRegistry:error:], 和 -[GPBMessage clearUnknownFields]

移除已弃用的旧 Gencode 运行时 API

此版本将移除支持 3.22.x 版本之前的 Objective-C gencode 的已弃用运行时方法。当旧的生成代码启动时,该库还将在运行时发出一条日志消息。

API: +[GPBFileDescriptor allocDescriptorForClass:file:fields:fieldCount:storageSize:flags:]

替代方案: 使用当前版本的库重新生成。

API: +[GPBFileDescriptor allocDescriptorForClass:rootClass:file:fields:fieldCount:storageSize:flags:]

替代方案: 使用当前版本的库重新生成。

API: +[GPBEnumDescriptor allocDescriptorForName:valueNames:values:count:enumVerifier:]

替代方案: 使用当前版本的库重新生成。

API: +[GPBEnumDescriptor allocDescriptorForName:valueNames:values:count:enumVerifier:extraTextFormatInfo:]

替代方案: 使用当前版本的库重新生成。

API: -[GPBExtensionDescriptor initWithExtensionDescription:]

替代方案: 使用当前版本的库重新生成。

其他变更

除了这些重大变更之外,还有一些其他值得注意的变更。虽然以下内容不被视为重大变更,但它们仍可能影响用户。

毒丸警告

v30 将更新“毒丸”(poison pills),为在新的滚动升级策略下可以工作的旧 gencode + 新运行时组合发出警告,但这些组合将在下一个主版本升级中中断。例如,Java 4.x.x gencode 应该可以与 5.x.x 运行时一起工作,但会警告即将与 6.x.x 运行时发生中断。

C# 和 Ruby 中 UTF-8 强制执行的变更

v30 将包含一个修复,以使 UTF-8 强制执行在各种语言中保持一致。在字符串字段中包含不良非 UTF-8 数据的用户可能会更早地看到浮现的 UTF-8 强制执行错误。