變更於 2024 年 11 月 7 日宣布
以下章節涵蓋 v30 版本中計劃的重大變更,預計在 2025 年第一季發布。此外,還包括一些非重大變更,但可能需要您採取行動。這些變更是在 10 月 2 日的新聞文章中提到的變更之外。
這些描述變更時,是根據我們預期的實作方式,但由於軟體的彈性性質,其中一些變更可能不會實現,或者可能與本主題中的描述有所不同。
在 Arena 上清除 Oneof 訊息後引入 ASAN Poisoning
此變更新增了強化檢查,會影響使用 Arena 的 C++ protobufs。在 protobuf arena 上配置的 Oneof 訊息現在將在偵錯模式下清除,並在 ASAN 模式下 poisoned。在呼叫 clear 之後,未來嘗試使用記憶體區域將會在 ASAN 中導致當機,並顯示 use-after-free 錯誤。
此實作需要 C++17。
Map 欄位的 Python setdefault 行為變更
從 v30 開始,setdefault
對於 ScalarMap
將會類似於 dict
,但鍵和值都必須設定。setdefault
將會拒絕 MessageMaps
。
移除已棄用的 py_proto_library Macro
在 protobuf.bzl
中已棄用的內部 py_proto_library
Bazel macro 將會在 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 將會針對這些錯誤情況包含警告。