Version 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.py
和 setup.cfg
支援
在 26.x 版本中,setup.py
和 setup.cfg
將不再存在於 GitHub 儲存庫或 GitHub 發行 tarball 的 python/
目錄中。這表示將不再可能直接從 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
) - 移除未設定的子訊息欄位
- 移除未設定的 oneof 欄位。(
- 使用訊息的 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 剖析中的不符。