Version 26.x 新聞公告

Protocol Buffers 版本 26.x 公告的變更。

以下公告是針對版本 26.x。如需依時間順序呈現的資訊,請參閱新聞

一般變更

JSON 格式器選項變更

從 26.x 系列開始,用於列印預設值欄位的 JSON 格式器選項已替換為一致處理 proto2 和 proto3 optional 欄位的固定方式。

  • Java:includingDefaultValueFields() 已替換為 alwaysPrintFieldsWithNoPresence()
  • C++:always_print_default_values 已替換為 always_print_fields_with_no_presence=True
  • Py:including_default_value_fields=True 已替換為 always_print_fields_with_no_presence=True

新標記在 proto3 訊息上的行為與舊標記相同,但不再適用於 proto2 optional 欄位。舊標記適用於 proto2 optional 欄位,但不適用於 proto3 optional 欄位。

Poison Pilling Gencode / 執行階段不符

根據我們的跨版本執行階段保證,Protobuf 不支援跨主要版本界限混合產生程式碼和執行階段,或在單一主要執行階段版本內混合來自較新版本 protoc 的產生程式碼與較舊的執行階段。我們計畫引入「poison pills」來偵測和強制執行這些不允許的不符。

這不被視為破壞性變更,因為這僅是增加對現有政策的強制執行,但可能需要使用者更新其產生程式碼。

C++ 破壞性變更

在 v26 中,我們計畫根據我們的破壞性變更政策版本支援政策,對 C++ 進行主要版本升級。

以下章節概述我們計畫在 Protocol Buffers 26.0 版本中包含的一組破壞性變更。請注意,計畫可能會而且確實會變更。這些是可能發生的破壞性變更,但它們可能不會在這個特定版本中發生,或者它們可能根本不會發生。

移除重複欄位上已棄用的清除 API

以下已棄用的方法已移除

  • RepeatedPtrField::ReleaseCleared()
  • RepeatedPtrField::ClearedCount()
  • RepeatedPtrField::AddCleared()

移除 C++ 舊版語法描述符 API

隨著版本的發布,語法不再支援業務邏輯。請改用 descriptor.h 中定義的各種功能輔助程式來查詢更具針對性的行為,例如 has_presence,以在 C++ 中查詢功能。

移除已棄用的語法存取器

我們計畫在 v26 中移除已棄用的語法存取器 FileDescriptor::Syntax。我們建議改用 FileDescriptor::edition 中的 getter。

移除已棄用的 SupportsUnknownEnumValues 方法

SupportsUnknownEnumValues 方法已在2023 年 3 月棄用。我們計畫在 v26 中移除它。

移除 std::string 錯誤收集器覆寫

我們計畫移除錯誤收集器中已棄用的 std::string 方法。

Java 破壞性變更

在 v26 中,我們計畫根據我們的破壞性變更政策版本支援政策,對 Java 進行主要版本升級。

以下章節概述我們計畫在 Protocol Buffers 26.0 版本中包含的一組破壞性變更。請注意,計畫可能會而且確實會變更。這些是可能發生的破壞性變更,但它們可能不會在這個特定版本中發生,或者它們可能根本不會發生。

破壞與舊版產生程式碼的相容性

v26.x 將破壞與舊版主要版本產生程式碼的相容性。使用者應重新產生舊版產生程式碼,使其與版本相同。

例如,最初為了與 v2.x.x 針對 v3.x.x 執行階段的產生程式碼向後相容而引入的 GeneratedMessageV3,將重新命名為 GeneratedMessage。執行階段將更新以支援版本,這將與舊版產生程式碼不相容。

這符合我們現有的跨版本執行階段保證,並且是一項破壞性變更。

移除已棄用的方法/變數

v26.x 將移除對已棄用方法和變數的存取權。這些通常已在先前的版本中標記為 @Deprecated

這將移除對以下非詳盡清單的存取權

  • 描述符語法 API,應替換為對應的功能存取器 (例如 FieldDescriptor.hasPresence()EnumDescriptor.isClosed())

  • TextFormat 列印方法,應替換為對應的 TextFormat.printer() 方法。

  • PARSER 變數,應替換為 parser() 方法。

  • 舊版 v2.x.x gencode 相容性的執行階段方法。根據我們的跨版本執行階段保證,這不再受支援。

更多詳細資訊將在對應的版本資訊中提供。

PHP 破壞性變更

以下變更計畫用於 26.x 系列

  • 驗證設定器中字串欄位的 UTF-8。
  • 移除通用服務。(commit 40ad3fa)

Python 破壞性變更

在 v26 中,我們計畫根據我們的破壞性變更政策版本支援政策,對 Python 進行主要版本升級。

以下變更計畫用於 26.x 系列

  • 使 str(msg) 逸出字串欄位中的任何無效 UTF-8。
  • 使 text_format.MessageToString() 預設輸出原始 UTF-8,同時逸出任何無效 UTF-8 序列。
  • 修正時間戳記界限 (commit 1250d5f)

移除已棄用的 API

在 26.x 版本中,將移除以下已棄用的 API

拒絕使用 None Iterable 擴充重複欄位

從 26.x 版本開始,使用 None iterable 擴充重複欄位將被拒絕 (將引發 TypeError)。例如,m.repeated_int32.extend(None) 將被拒絕。

移除訊息類別中的 RegisterExtension

從 26.x 版本開始,RegisterExtension 將被移除。您可以使用訊息物件上的 Extensions 屬性在 Python 中存取擴充功能。

這會影響純 Python 和 Python 的 C++ 實作,但不影響 upb Python。

從 GitHub 移除 setup.pysetup.cfg 支援

在 26.x 版本中,setup.pysetup.cfg 將不再存在於 GitHub 儲存庫或 GitHub 發行 tarballpython/ 目錄中。這表示將不再可能直接從 GitHub 儲存庫或發行 tarball 建置 Python 套件。

發布在 PyPI 上的 Python 原始碼套件繼續在頂層目錄中包含 setup.py。對於不想使用我們在 PyPI 上發布的二進位套件的使用者來說,這是建置 Python 二進位套件的受支援和建議方式。

如需更多資訊,請參閱 #15671

時間戳記會檢查有效性

在 v26 中,系統將檢查 Timestamp 值是否有效。秒數必須在 [-62135596800, 253402300799] 範圍內,奈秒必須在 [0, 999999999] 範圍內。超出這些範圍的值將引發例外。

移除已棄用的語法存取器

我們計畫在 v26 中移除已棄用的語法存取器 FileDescriptor.syntax。我們計畫在其位置新增 FileDescriptor.edition

UnknownFields 支援移除

在 v25 中,message.UnknownFields() 已在純 Python 和 C++ 擴充功能中棄用。我們計畫在 v26 中移除它。使用 unknown_fields.py 中新的 UnknownFieldSet(message) 支援作為替代方案。

關於所有這些變更的更多詳細資訊將在對應的版本資訊中提供。

Ruby 破壞性變更

  • 修正 RepeatedField#each_index 以具有正確的語意。(#11767)
  • 移除 Ruby DSL 和相關的相容性程式碼,這將完成在四月公告的遷移。
  • Message#to_h 修正
    • 移除未設定的 oneof 欄位。(#6167)
    • 移除未設定的子訊息欄位
  • 使用訊息的 pool 進行 encode_json/decode_json
  • 移除已棄用的語法存取器 FileDescriptor.syntax,並在其位置新增語意檢查
    • FieldDescriptor.has_presence 測試欄位是否具有存在性。
    • FieldDescriptor.is_packed 測試重複欄位是否為 packed。
    • FieldDescriptor.requires_utf8_validation 測試字串欄位是否需要 UTF-8 驗證。
    • EnumDescriptor.is_closed 測試列舉是否為 closed。

Freeze 現在在 Ruby 中是遞迴的

從 26.x 系列開始,當套用 freeze 時,它將以遞迴方式套用,影響所有子訊息、map 和重複欄位。

upb 破壞性變更

以下變更計畫用於 26.x 系列

  • 修正啟用 IgnoreUnknownEnumString 時 JSON 剖析中的不符。