2024 年 11 月 7 日宣布的变更

Protocol Buffers 于 2024 年 11 月 7 日宣布的变更。

以下部分介绍了 v30 版本中计划进行的破坏性变更,该版本预计在 2025 年第一季度发布。此外还包括一些非破坏性但可能需要您采取行动的变更。这些变更补充了10 月 2 日的新闻文章中提及的内容。

这些描述了我们预计将实施的变更,但由于软件的灵活性,其中一些变更可能不会落地,或者与本主题中描述的方式有所不同。

在 Arena 上清除 Oneof 消息后引入 ASAN Poisoning

此变更增加了一个强化检查,影响使用 Arenas 的 C++ protobuf。分配在 protobuf arena 上的 Oneof 消息现在将在调试模式下被清除,并在 ASAN 模式下被 Poisoned。调用 clear 后,将来尝试使用该内存区域将在 ASAN 中导致崩溃,作为 use-after-free 错误。

此实现需要 C++17

Map 字段的 Python setdefault 行为变更

从 v30 开始,ScalarMap 的 setdefault 将类似于 dict,不同之处在于必须同时设置 key 和 value。MessageMaps 将拒绝使用 setdefault

移除已弃用的 py_proto_library Macro

protobuf.bzl 中已弃用的内部 py_proto_library Bazel 宏将在 v30.x 中移除。

应将其替换为官方的 py_proto_library,该宏将从 v29.x 开始移至 protobuf 的 bazel/py_proto_library 中。在 v29.x 之前,此实现曾在 rules_python 中提供。

Python 嵌套消息类 __qualname__ 包含外部消息名称

Python 嵌套消息类 __qualname__ 现在包含外部消息名称。在 v30 之前,对于嵌套消息,__qualname__ 的结果与 __name__ 相同,即不包含外部消息名称。

例如

message Foo {
  message Bar {
    bool bool_field = 1;
  }
}
nested = test_pb2.Foo.Bar()
self.assertEqual('Bar', nested.__class__.__name__)
self.assertEqual('Foo.Bar', nested.__class__.__qualname__) # It was 'Bar' before

放弃我们的 C++ CocoaPods 版本发布

在 v30 中,我们将放弃我们的 C++ CocoaPods 版本发布,该版本自 v4.x.x 起已损坏。C++ 用户应直接使用我们的GitHub 版本

JSON 解析中的 Ruby 和 PHP 错误

v30 修复了根据JSON 规范解析数字字段中字符串时不符合标准的问题。

此修复不会伴随主要版本号的提升,但 Ruby 和 PHP 现在会对数字字段中的非数字字符串(例如“”, “12abc”, “abc”)引发错误。v29.x 将对这些错误情况包含警告。