于 2025 年 9 月 19 日宣布的变更
以下各节涵盖了计划在 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
当将不正确的类型转换为 Timestamp
或 Duration
时,此版本将引发 TypeError
而不是 AttributeError
。
拒绝将 bool 转换为枚举和整型字段
此版本将拒绝使用布尔值设置枚举或整型字段。API 将引发错误,而不是隐式转换它们。
从 json_format 中移除 float_precision
此版本将从 json_format
序列化器中移除已弃用的 float_precision
选项。该选项在其他 ProtoJSON 序列化器中不存在,并且其语义令人困惑。
从 text_format 中移除 float_format/double_format
此版本将从 text_format
中移除已弃用的 float_format
和 double_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 序列化器也将拒绝用于数值的 Infinity
和 NaN
。
修复默认值被静默忽略的问题
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 在此版本中不会有主版本号的升级。