于 2025 年 9 月 19 日宣布的变更

于 2025 年 9 月 19 日宣布的 Protocol Buffers 变更。

以下各节涵盖了计划在 v34 版本中进行的破坏性变更,该版本预计在 2026 年第一季度发布。这些描述了我们预期的变更实现方式,但由于软件的灵活性,其中一些变更可能不会落地,或者可能与本主题中的描述有所不同。

C++ 的变更

C++ 将在 7.34.0 版本中将其主版本号提升至 7。6.33 将是 6.x 系列的最后一个次要版本。

移除 Future 宏

以下为分阶段推出破坏性变更而引入的宏将被移除,其行为将成为默认行为

  • PROTOBUF_FUTURE_RENAME_ADD_UNUSED_IMPORT
  • PROTOBUF_FUTURE_REMOVE_ADD_IGNORE_CRITERIA
  • PROTOBUF_FUTURE_STRING_VIEW_DESCRIPTOR_DATABASE
  • PROTOBUF_FUTURE_NO_RECURSIVE_MESSAGE_COPY

新的 RepeatedPtrField 布局

RepeatedPtrField 将过渡到一种新的内部元素布局,其中元素存储在连续的预分配内存块中,类似于 std::deque。这将导致某些 API 的复制/移动语义发生一些变化,并且某些 UnsafeArena API 可能会在功能上等同于其 Arena 安全的对应项并被弃用。

对 RepeatedField::Get 和 RepeatedPtrField::Get 进行 MSB 强化检查

Protobufs 将通过向重复字段访问添加全面的边界检查来加强对 OOB(越界)错误的防范。

从重复字段中移除 Arena 指针

RepeatedPtrField(Arena*) 构造函数将被删除。

移除已弃用的 API

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

AddUnusedImportTrackFile() 和 ClearUnusedImportTrackFiles()

API: AddUnusedImportTrackFile()ClearUnusedImportTrackFiles()

替代方案: AddDirectInputFile()ClearDirectInputFiles()

来自 message differencer 的 AddIgnoreCriteria

PROTOBUF_FUTURE_REMOVE_ADD_IGNORE_CRITERIA 是为此项破坏性变更添加的。此版本将移除该宏。

API: AddIgnoreCriteria()

替代方案: 将裸指针包装在 unique_ptr 中。

FieldDescriptor::has_optional_keyword()

API: FieldDescriptor::has_optional_keyword()

替代方案: has_presence()

FieldDescriptor::label()

API: FieldDescriptor::label()

替代方案: is_repeated()is_required()

FieldDescriptor::is_optional()

API: FieldDescriptor::is_optional()

替代方案: !is_required() && !is_repeated()

UseDeprecatedLegacyJsonFieldConflicts()

API: UseDeprecatedLegacyJsonFieldConflicts()

替代方案: 无替代方案。

更严格的名称长度限制

protobuf 编译器将对符号名称(例如字段名称)的长度强制执行更严格的限制,以防止潜在问题。如果任何字段名称的长度 > 2^16,它将生成一个错误。

在 CMake 中隐藏私有生成器头文件

protoc 生成器头文件将不再由 CMake 安装。这应该不会影响大多数用户。

在逻辑常量操作上使用 [[nodiscard]]

[[nodiscard]] 将被添加到几个逻辑上是常量的 protobuf API 中,在这些 API 中,若不使用返回值则可能表示存在 bug。这遵循了 C++ 标准库中常用的模式。

Python 中的变更

Python 将在 7.34.0 版本中将其主版本号提升至 7。6.33 将是 6.x 系列的最后一个次要版本。

gencode 没有变化,我们将放宽毒丸(poison pills)机制。对于 7.34.x 版本,旧的生成文件不会引发任何警告或错误。

在向 Timestamp/Duration 进行不正确类型转换时引发 TypeError

当将不正确的类型转换为 TimestampDuration 时,此版本将引发 TypeError 而不是 AttributeError

拒绝将 bool 转换为枚举和整型字段

此版本将拒绝使用布尔值设置枚举或整型字段。API 将引发错误,而不是隐式转换它们。

从 json_format 中移除 float_precision

此版本将从 json_format 序列化器中移除已弃用的 float_precision 选项。该选项在其他 ProtoJSON 序列化器中不存在,并且其语义令人困惑。

从 text_format 中移除 float_format/double_format

此版本将从 text_format 中移除已弃用的 float_formatdouble_format 选项。这些选项在其他 proto 文本格式序列化器中不可用。

移除已弃用的 API

此版本将移除以下公共运行时 API。

FieldDescriptor.label

API: FieldDescriptor.label

替代方案: 使用 is_repeated()is_required()

PHP 中的变更

PHP 将在 5.34.0 版本中将其主版本号提升至 5。4.33 将是 4.x 系列的最后一个次要版本。

移除已弃用的 API

此版本将移除以下公共运行时 API。

FieldDescriptor getLabel

API: FieldDescriptor getLabel

替代方案: isRepeated()isRequired()

Google\Protobuf\Field_Kind

API: Google\Protobuf\Field_Kind

替代方案: Google\Protobuf\Field\Kind

Google\Protobuf\Field_Cardinality

API: Google\Protobuf\Field_Cardinality

替代方案: Google\Protobuf\Field\Cardinality

Google\Protobuf\Internal\RepeatedField

API: Google\Protobuf\Internal\RepeatedField

替代方案: Google\Protobuf\RepeatedField

JSON 解析严格性

JSON 解析器将变得更加严格,并拒绝几种以前接受的情况。这包括超出范围的值、用于整型字段的非整数数值、重复的 oneof 字段以及用于字符串字段的非字符串值。JSON 序列化器也将拒绝用于数值的 InfinityNaN

修复默认值被静默忽略的问题

PHP 运行时将被修复,以支持 proto2 和 editions 中标量字段的默认值,而不是静默忽略它们。

类型检查对齐

纯 PHP 和 upb-PHP 实现的类型检查将保持一致。值得注意的是,纯 PHP 将拒绝字符串字段的 null 值,以匹配 upb-PHP 的行为。

Objective-C 中的变更

Objective-C 将在 5.34.0 版本中将其主版本号提升至 5。4.33 将是 4.x 系列的最后一个次要版本。

一些 GPB*Dictionary API 的可空性(nullability)注解将被更正,以标记 API 何时可能返回 nil。这将导致 Swift 代码获取一个 Swift Optional<T>,从而成为一个破坏性的 API 变更。对于 Objective-C 调用者,注解的更正对源代码的影响可能较小。

移除已弃用的 API

此版本将移除以下公共运行时 API。

-[GPBFieldDescriptor optional]

API: -[GPBFieldDescriptor optional]

替代方案: 使用 !required && fieldType == GPBFieldTypeSingle 代替。

其他变更

以下是其他破坏性变更。

Bazel:移除已弃用的 ProtoInfo.transitive_imports

ProtoInfo 中已弃用的 transitive_imports 字段将被移除。用户应迁移到 transitive_sources

移除 protobuf_allow_msvc 标志并继续支持 Bazel+MSVC

由于 Bazel 近期在 Windows 上的改进,我们现在计划继续支持 Bazel+MSVC。--define=protobuf_allow_msvc 标志将被移除。

没有主版本号升级的语言

Java、Ruby、C#、Rust 和 JRuby 在此版本中不会有主版本号的升级。