2024 年 10 月 2 日宣布的變更

於 2024 年 10 月 2 日針對 Protocol Buffers 宣布的變更。

以下各節涵蓋預計在 2025 年第一季發佈的 v30 版本中的計畫中重大變更。這些描述了我們預期實作的變更,但由於軟體的彈性本質,其中某些變更可能不會實作,或可能與本主題中的描述有所不同。

C++ 中的變更

C++ 的主要版本將從 5.29.x 升級到 6.30.x。

描述符 API

v30 將更新描述符(例如 full_name)中的傳回類型以成為 absl::string_view。這可節省描述符中的記憶體。

v28 推出了 PROTOBUF_FUTURE_STRING_VIEW_RETURN_TYPE 巨集,您可以在此期間使用它,在重大版本發佈之前啟用更新的傳回類型。v30 版本將反轉預設值並移除巨集。

從 FieldDescriptor 選項中移除 ctype

v30 將停止從 FieldDescriptor 選項公開 ctype。您可以改用在v28 版本中新增的 FieldDescriptor::cpp_string_type() API。

將 CMake 子模組取代為已擷取的相依性

v30 將移除子模組,並切換為 upb 的舊版 CMake 相依性擷取模式。

如果您使用已安裝的套件,則不會受到影響。這可能會中斷某些 CMake 工作流程。

移除已棄用的 API

v30 將移除下列公開的執行階段 API,這些 API 已標示為至少一個次要或主要版本已棄用 (例如 ABSL_DEPRECATED),且已過時或已取代。

Arena::CreateMessage

API: Arena::CreateMessage

取代項目: Arena::Create

Arena::GetArena

API: Arena::GetArena

取代項目: value->GetArena()

RepeatedPtrField::ClearedCount

API: RepeatedPtrField::ClearedCount

取代項目:遷移至 Arenas (遷移指南)。

JsonOptions

API: JsonOptions

取代項目: JsonPrintOptions

停止支援 C++14

根據基礎 C++ 支援矩陣,此版本會將 C++ 14 作為最低支援版本移除,並將其提升至 17。

根據我們的政策,我們不認為這是一項重大變更。

JRuby 中的變更

v30 將把 JRuby 的預設實作翻轉為 FFI,這對某些 JRuby 使用者來說可能會是重大變更。

請注意,此變更不會建立 Ruby 主要版本升級,因為 JRuby 未獲官方支援

Python 中的變更

Python 的主要版本將從 5.29.x 升級到 6.30.x。

停止支援 Python 3.8

根據我們的官方 Python 支援政策,我們將停止支援 Python 3.8 及更低版本。這表示最低支援的 Python 版本為 3.9。

移除 bazel/system_python.bzl 別名

v30 將移除舊版的 bazel/system_python.bzl 別名。

移除對 system_python.bzl 的直接參考,改為使用 protobuf_deps.bzl。如果您需要直接參考,請使用在 v5.27.0 中移動的 python/dist/system_python.bzl

欄位設定器驗證變更

Python 和 upb 的欄位設定器將在 v30 中修正,以在 2023 版本下驗證封閉列舉。以無效值更新的封閉列舉欄位將產生錯誤。

移除已棄用的 API

v30 將移除下列公開的執行階段 API,這些 API 已標示為至少一個次要或主要版本已棄用,且已過時或已取代。

反射方法

API: reflection.ParseMessagereflection.MakeClass

取代項目: message_factory.GetMessageClass()

RPC 服務介面

API: service.RpcExceptionservice.Serviceservice.RpcControllerservice.RpcChannel

取代項目:從 2.3.0 版開始,RPC 實作不應嘗試以此為基礎建置,而是應提供程式碼產生器外掛程式,產生特定於特定 RPC 實作的程式碼。

MessageFactory 和 SymbolDatabase 方法

API: MessageFactory.GetPrototypeMessageFactory.CreatePrototypeMessageFactory.GetMessagesSymbolDatabase.GetPrototypeSymbolDatabase.CreatePrototypeSymbolDatabase.GetMessages

取代項目: message_factory.GetMessageClass()message_factory.GetMessageClassesForFiles()

GetDebugString

API: GetDebugString

取代項目

沒有取代項目。它僅在不再發佈的 Python C++ 中。純 Python 或 UPB 中不支援此項目。

Objective-C 中的變更

這將是 Objective-C 的第一個重大版本.

Objective-C 的主要版本將從 3.x.x 升級到 4.30.x。

徹底修改未知欄位處理 API,並棄用大多數現有 API

v30 將棄用 GPBUnknownFieldSet,並以 GPBUnknownFields 取代它。新的類型將保留來自原始輸入或 API 呼叫的未知欄位順序,以確保在將訊息寫回時保持順序的任何語義意義。

作為此的一部分,GPBUnknownField 類型的 API 也會變更,幾乎所有現有 API 都會被棄用,並新增新的 API。

已棄用的屬性 API

  • varintList
  • fixed32List
  • fixed64List
  • lengthDelimitedList
  • groupList

已棄用的修改 API

  • addVarint
  • addFixed32
  • addFixed64
  • addLengthDelimited
  • addGroup

已棄用的初始化程式 initWithNumber:

新的屬性 API

  • type
  • varint
  • fixed32
  • fixed64
  • lengthDelimited
  • group

此類型將在其值中模擬單一欄位編號,而不是分組給定欄位編號的所有值。用於建立新欄位的 API 是 GPBUnknownFields 類別上的 add* API。

v30 也將棄用 -[GPBMessage unknownFields]。取而代之的是,將會有新的 API 來擷取和更新訊息的未知欄位。

移除已棄用的 API

v30 將移除下列公開的執行階段 API,這些 API 已標示為至少一個次要或主要版本已棄用,且已過時或已取代。

GPBFileDescriptor

API: -[GPBFileDescriptor syntax]

取代項目:已過時。

GPBMessage mergeFrom:extensionRegistry

API: -[GPBMessage mergeFrom:extensionRegistry:]

取代項目: -[GPBMessage mergeFrom:extensionRegistry:error:]

GPBDuration timeIntervalSince1970

API: -[GPBDuration timeIntervalSince1970]

取代項目: -[GPBDuration timeInterval]

GPBTextFormatForUnknownFieldSet

API: GPBTextFormatForUnknownFieldSet()

取代項目:已過時 - 使用 GPBTextFormatForMessage(),其中包含任何未知欄位。

GPBUnknownFieldSet

API: GPBUnknownFieldSet

取代項目: GPBUnknownFields

GPBMessage unknownFields

API: GPBMessage unknownFields 屬性

取代方式: -[GPBUnknownFields initFromMessage:]-[GPBMessage mergeUnknownFields:extensionRegistry:error:]-[GPBMessage clearUnknownFields]

移除舊版產生程式碼的已棄用執行階段 API

此版本將移除在 3.22.x 版本之前,支援 Objective-C gencode 的已棄用執行階段方法。當舊的產生程式碼開始執行時,程式庫也會在執行階段發出記錄訊息。

API: +[GPBFileDescriptor allocDescriptorForClass:file:fields:fieldCount:storageSize:flags:]

取代方式: 使用目前版本的程式庫重新產生。

API: +[GPBFileDescriptor allocDescriptorForClass:rootClass:file:fields:fieldCount:storageSize:flags:]

取代方式: 使用目前版本的程式庫重新產生。

API: +[GPBEnumDescriptor allocDescriptorForName:valueNames:values:count:enumVerifier:]

取代方式: 使用目前版本的程式庫重新產生。

API: +[GPBEnumDescriptor allocDescriptorForName:valueNames:values:count:enumVerifier:extraTextFormatInfo:]

取代方式: 使用目前版本的程式庫重新產生。

API: -[GPBExtensionDescriptor initWithExtensionDescription:]

取代方式: 使用目前版本的程式庫重新產生。

其他變更

除了上述重大變更之外,還有一些其他值得注意的變更。雖然以下變更不被視為重大變更,但仍可能影響使用者。

毒藥警告

v30 將更新毒藥丸 (poison pills),針對在新滾動升級政策下運作的舊 gencode + 新執行階段組合發出警告,但在下一個主要版本升級中將會中斷。例如,Java 4.x.x gencode 應該可以對 5.x.x 執行階段運作,但會警告即將針對 6.x.x 執行階段發生的中斷。

C# 和 Ruby 中 UTF-8 強制執行方式的變更

v30 將包含一個修正,使 UTF-8 強制執行在各種語言之間保持一致。字串欄位中含有不良非 UTF-8 資料的使用者可能會更早發現 UTF-8 強制執行錯誤。