バージョン30.xのニュースアナウンス
以下の発表は、2025年3月4日にリリースされたバージョン30.xに特化したものです。時系列の情報については、「ニュース」を参照してください。
以下のセクションでは、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では、ProtobufデバッグAPI(Protobuf AbslStringify、proto2::ShortFormat、proto2::Utf8Format、Message::DebugString、Message::ShortDebugString、Message::Utf8DebugStringを含む)を修正し、debug_redactで注釈が付けられた機密フィールドを編集する予定です。これらのAPIの出力にはプロセスごとのランダムなプレフィックスが含まれるため、Protobuf TextFormatパーサーでは解析できなくなります。
詳細については、2024年11月21日に公開されたニュース記事をご覧ください。
リフレクション関連関数の削除
以下のリフレクション関連関数を削除します: MutableRepeatedFieldRef<T>::Reserve()。
RepeatedPtrFieldにおける今後のパフォーマンス改善は、このAPIと互換性がありません。この改善により、RepeatedPtrFieldの要素への繰り返しアクセス、特にシーケンシャルアクセスが高速化されると予想されます。
非推奨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に引き上げます。
当社のポリシーにより、これは破壊的変更とはみなされません。
Arena上のOneofメッセージをクリアした後にASANポイズニングを導入
この変更により、Arenaを使用するC++ protobufに影響を与える強化チェックが追加されます。protobufアリーナに割り当てられたOneofメッセージは、デバッグモードではクリアされ、ASANモードではポイズニングされます。クリアを呼び出した後、メモリ領域を使用しようとすると、ユースアフターフリーエラーとしてASANでクラッシュが発生します。
この実装にはC++17が必要です。
C++ CocoaPodsリリースの中止
v30では、v4.x.x以降破損しているC++ CocoaPodsリリースを中止します。C++ユーザーは、代わりにGitHubリリースを直接使用する必要があります。
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のフィールドセッターが修正され、2023年版でクローズドな列挙型が検証されるようになります。無効な値で更新されたクローズドな列挙型フィールドはエラーを生成します。
非推奨のpy_proto_libraryマクロの削除
protobuf.bzl内の非推奨の内部py_proto_library Bazelマクロはv30.xで削除されます。
これは、v29.xからbazel/py_proto_libraryにあるprotobufに移動される公式のpy_proto_libraryに置き換えられるべきです。この実装は、v29.xより前はrules_pythonで利用可能でした。
非推奨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ではサポートされていません。
Python のマップフィールドに対する setdefault の動作変更
v30以降、setdefaultはScalarMapの場合、dictと同様になりますが、キーと値の両方が設定されている必要があります。MessageMapsの場合、setdefaultは拒否されます。
Python のネストされたメッセージクラスの __qualname__ が外側のメッセージ名を含むように
Pythonのネストされたメッセージクラスの__qualname__には、外部メッセージ名が含まれるようになりました。v30より前は、__qualname__はネストされたメッセージの__name__と同じ結果となり、外部メッセージ名は含まれていませんでした。
例:
message Foo {
message Bar {
bool bool_field = 1;
}
}
nested = test_pb2.Foo.Bar()
self.assertEqual('Bar', nested.__class__.__name__)
self.assertEqual('Foo.Bar', nested.__class__.__qualname__) # It was 'Bar' before
Objective-Cでの変更
これはObjective-Cにとって最初の破壊的リリースとなります。.
Objective-Cはメジャーバージョンを3.x.xから4.30.xに引き上げます。
不明なフィールド処理APIの全面的な見直しと既存APIの大部分の非推奨化
v30ではGPBUnknownFieldSetを非推奨とし、GPBUnknownFieldsに置き換えます。新しい型は、元の入力またはAPI呼び出しからの不明なフィールドの順序を保持し、メッセージが書き出されたときに順序のセマンティックな意味が維持されるようにします。
これに伴い、GPBUnknownField型のAPIも変更され、既存のAPIのほとんどが非推奨となり、新しいAPIが追加されます。
非推奨のプロパティAPI
varintListfixed32Listfixed64ListlengthDelimitedListgroupList
非推奨の変更API
addVarintaddFixed32addFixed64addLengthDelimitedaddGroup
非推奨のイニシャライザ initWithNumber:。
新しいプロパティAPI
typevarintfixed32fixed64lengthDelimitedgroup
この型は、特定のフィールド番号のすべての値を「グループ化」するのではなく、その値に単一のフィールド番号をモデル化します。新しいフィールドを作成するための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:]
代替: ライブラリの最新バージョンで再生成してください。
その他の変更
MSVC + Bazel のポイズニング
v34では、BazelとMSVCの併用に対するサポートを終了します。v30からは、オプトアウトフラグ--define=protobuf_allow_msvc=trueを指定してエラーを抑制しない限り、この組み合わせを使用するとエラーが発生するようにポイズニングします。
MSVCのパス長の制限とBazelのサンドボックス機能の組み合わせは、サポートがますます困難になっています。protobufを長いパスにインストールしたユーザーがランダムに破損するのを防ぐため、BazelからのMSVCの使用を全面的に禁止します。CMakeによるMSVCのサポートは継続し、Bazelでのclang-clのサポートを開始します。フィードバックや議論については、https://github.com/protocolbuffers/protobuf/issues/20085をご覧ください。
その他の変更(非破壊的)
これらの破壊的変更に加えて、注目すべきその他の変更がいくつかあります。以下の変更は破壊的変更とはみなされませんが、ユーザーに影響を与える可能性があります。
ポイズンピルの警告
v30では、毒薬が更新され、新しいローリングアップグレードポリシーの下で機能する古いgencodeと新しいランタイムの組み合わせ(ただし、次のメジャーバージョンアップで破損する)に対して警告が発行されます。たとえば、Java 4.x.x gencodeは5.x.xランタイムに対して機能しますが、6.x.xランタイムに対しては今後の破損を警告します。
C#とRubyにおけるUTF-8強制の変更
v30には、UTF-8の適用を言語間で一貫させるための修正が含まれます。文字列フィールドに不正な非UTF8データを持つユーザーは、UTF-8適用エラーがより早く表面化する可能性があります。
JSON 解析における Ruby と PHP のエラー
v30では、JSON仕様に従い、数値フィールド内の文字列のJSON解析における非準拠を修正します。
この修正にはメジャーバージョンアップは伴いませんが、RubyとPHPでは、数値フィールド内の非数値文字列(例: ""、"12abc"、"abc")に対してエラーが発生するようになります。v29.xには、これらのエラーケースに対する警告が含まれます。