2024年10月2日に発表された変更
以下のセクションでは、2025年第1四半期に予定されている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では、少なくとも1つのマイナーまたはメジャーリリースで非推奨(ABSL_DEPRECATED
など)とマークされており、廃止または置換された以下の公開ランタイムAPIを削除します。
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サポートの終了
このリリースでは、Foundational C++ Support matrixに従い、サポートする最小バージョンとしてC++ 14を廃止し、17に引き上げます。
私たちのポリシーに基づき、これは破壊的変更とは見なしません。
JRubyでの変更
v30では、JRubyのデフォルト実装がFFIに切り替わります。これは一部のJRubyユーザーにとって破壊的変更となる可能性があります。
JRubyは公式にはサポートされていないため、この変更はRubyのメジャーバージョンアップにはなりません。
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
を使用してください。
フィールドセッターの検証に関する変更
v30では、Pythonとupbのフィールドセッターが修正され、edition 2023下でクローズドenumを検証するようになります。無効な値で更新されたクローズドenumフィールドはエラーを生成します。
非推奨APIの削除
v30では、少なくとも1つのマイナーまたはメジャーリリースで非推奨とマークされており、廃止または置換された以下の公開ランタイム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++にのみ存在します。Pure 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では、少なくとも1つのマイナーまたはメジャーリリースで非推奨とマークされており、廃止または置換された以下の公開ランタイム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:]
代替: ライブラリの最新バージョンで再生成してください。
その他の変更
これらの破壊的変更に加えて、注目すべき他の変更点がいくつかあります。以下は破壊的変更とは見なされませんが、ユーザーに影響を与える可能性があります。
ポイズンピルの警告
v30では、ポイズンピルが更新され、新しいローリングアップグレードポリシーの下で機能するが、次のメジャーバージョンアップで壊れる古いgencodeと新しいランタイムの組み合わせに対して警告を発するようになります。例えば、Java 4.x.xのgencodeは5.x.xのランタイムに対しては動作しますが、6.x.xのランタイムでは将来的に壊れるという警告が表示されます。
C#とRubyにおけるUTF-8強制の変更
v30には、言語間でUTF-8の強制を一致させる修正が含まれます。文字列フィールドに不正な非UTF-8データを持つユーザーは、UTF-8強制エラーがより早い段階で表面化する可能性があります。