2024 年 11 月 7 日宣布的变更
以下部分涵盖了计划在 v30 版本中进行的重大更改,预计在 2025 年第一季度发布。还包括一些非重大更改,但可能需要您采取措施。这些更改是在 10 月 2 日的新闻文章中提到的更改之外的。
这些描述了我们预计的变更实施方式,但由于软件的灵活性,其中一些变更可能不会落地,或者可能与本主题中的描述有所不同。
在 Arena 上清除 Oneof 消息后引入 ASAN Poisoning
此更改添加了一个强化检查,会影响使用 Arena 的 C++ protobuf。在 protobuf arena 上分配的 Oneof 消息现在将在调试模式下清除,并在 ASAN 模式下进行 poisoning。调用 clear 后,将来尝试使用该内存区域将导致 ASAN 中出现 use-after-free 错误而崩溃。
此实现需要 C++17。
Python setdefault Map 字段的行为变更
从 v30 开始,setdefault
将类似于 dict
对于 ScalarMap
,除了必须同时设置键和值。setdefault
将拒绝用于 MessageMaps
。
移除已弃用的 py_proto_library 宏
已弃用的内部 py_proto_library
Bazel 宏在 protobuf.bzl
中将在 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 版本发布。
Ruby 和 PHP 在 JSON 解析中出现错误
v30 修复了 JSON 解析中数字字段中字符串的不一致性,根据 JSON 规范。
此修复不会伴随主要版本升级,但 Ruby 和 PHP 现在将为数字字段中的非数字字符串(例如“”、“12abc”、“abc”)引发错误。v29.x 将包含针对这些错误情况的警告。