2024 年 11 月 7 日宣布的變更

針對 Protocol Buffers 於 2024 年 11 月 7 日宣布的變更。

以下章節涵蓋了預計在 2025 年第一季發布的 v30 版本中計劃的重大變更。此外,還包括一些非重大變更,但可能需要您採取行動。這些是 10 月 2 日新聞文章中提到的變更之外的變更。

這些描述了我們預期的實作變更,但由於軟體的靈活性,某些變更可能不會實施,或者可能與本主題中的描述有所不同。

在清除 Arena 上的 Oneof 訊息後引入 ASAN 汙染

此變更新增了一個強化檢查,會影響使用 Arena 的 C++ protobuf。在 protobuf arena 上配置的 Oneof 訊息現在將在偵錯模式中清除,並在 ASAN 模式中毒化。呼叫清除後,未來嘗試使用記憶體區域會導致 ASAN 中發生使用後釋放錯誤而崩潰。

此實作需要 C++17

Python Map 欄位的 setdefault 行為變更

從 v30 開始,setdefault 對於 ScalarMap 將與 dict 類似,除了必須設定鍵和值。setdefault 將會拒絕 MessageMaps

移除已棄用的 py_proto_library 巨集

protobuf.bzl 中已棄用的內部 py_proto_library Bazel 巨集將在 v30.x 中移除。

這應該由官方的 py_proto_library 取代,它將從 v29.x 開始移至 bazel/py_proto_library 中的 protobuf。此實作先前在 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 將包含這些錯誤案例的警告。