2024 年 10 月 2 日宣布的變更
以下章節涵蓋預計於 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 版本將翻轉預設值並移除巨集。
ctype 從 FieldDescriptor 選項中移除
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
取代項目: 移轉至 Arena (移轉指南)。
JsonOptions
API: JsonOptions
取代項目: JsonPrintOptions
捨棄 C++14 支援
此版本將捨棄 C++ 14 作為最低支援版本,並根據基礎 C++ 支援矩陣,將其提高到 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
。
欄位 Setter 驗證變更
v30 中將修正 Python 和 upb 的欄位 setter,以在 2023 版本下驗證封閉列舉。以無效值更新的封閉列舉欄位將產生錯誤。
移除已棄用的 API
v30 將移除以下公用執行階段 API,這些 API 已被標記為已棄用至少一個次要或主要版本,並且已過時或被取代。
反射方法
API: reflection.ParseMessage
、reflection.MakeClass
取代項目: message_factory.GetMessageClass()
RPC 服務介面
API: service.RpcException
、service.Service
、service.RpcController
和 service.RpcChannel
取代項目: 從 2.3.0 版開始,RPC 實作不應嘗試以此為基礎建置,而應提供程式碼產生器外掛程式,以產生特定於特定 RPC 實作的程式碼。
MessageFactory 和 SymbolDatabase 方法
API: MessageFactory.GetPrototype
、MessageFactory.CreatePrototype
、MessageFactory.GetMessages
、SymbolDatabase.GetPrototype
、SymbolDatabase.CreatePrototype
和 SymbolDatabase.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
]
移除舊版 Gencode 的已棄用執行階段 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: -[GPBExtensionDescriptor initWithExtensionDescription:]
取代項目: 使用目前版本的程式庫重新產生。
其他變更
除了這些重大變更之外,還有一些其他值得注意的變更。雖然以下變更不被視為重大變更,但它們可能仍然會影響使用者。
Poison Pill 警告
v30 將更新 Poison Pill 以針對新的滾動升級政策下可運作的舊版 gencode + 新執行階段組合發出警告,但在下一個主要升級中將會中斷。例如,Java 4.x.x gencode 應適用於 5.x.x 執行階段,但會警告即將針對 6.x.x 執行階段中斷。
C# 和 Ruby 中 UTF-8 強制執行的變更
v30 將包含修復程式,以使 UTF-8 強制執行在各種語言之間保持一致。字串欄位中包含錯誤的非 UTF-8 資料的使用者可能會更早看到浮現的 UTF-8 強制執行錯誤。