バージョン 30.x のニュースとお知らせ
以下のお知らせは、2025 年 3 月 4 日にリリースされたバージョン 30.x に固有のものです。時系列で表示される情報については、ニュースを参照してください。
以下のセクションでは、2025 年第 1 四半期に予定されている v30 リリースで計画されている破壊的変更について説明します。また、破壊的変更ではありませんが、対応が必要になる可能性のある変更も含まれています。これらは、実装が予定されている変更を説明していますが、ソフトウェアの柔軟な性質により、これらの変更の一部は実装されないか、このトピックで説明されている内容とは異なる場合があります。
C++ の変更点
C++ はメジャーバージョンを 5.29.x から 6.30.x に引き上げます。
Descriptor API
v30 では、descriptor (full_name
など) の戻り値の型が absl::string_view
に更新されます。これにより、descriptor のメモリを節約できます。
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 に引き上げます。
Google のポリシーに従い、これは破壊的変更とは見なしません。
Arena 上で Oneof メッセージをクリアした後に ASAN ポイズニングを導入
この変更により、Arena を使用する C++ protobuf に影響を与える強化チェックが追加されます。protobuf arena に割り当てられた Oneof メッセージは、デバッグモードではクリアされ、ASAN モードではポイズニングされます。clear を呼び出した後、そのメモリ領域を将来使用しようとすると、ASAN で use-after-free エラーとしてクラッシュが発生します。
この実装には 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 サポートの終了
Google の公式 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 で edition 2023 の下でクローズド enum を検証するように修正されます。無効な値で更新されたクローズド enum フィールドはエラーを生成します。
非推奨の py_proto_library マクロの削除
protobuf.bzl
内の非推奨の内部 py_proto_library
Bazel マクロは v30.x で削除されます。
これは、v29.x 以降 protobuf の bazel/py_proto_library
に移動される公式の 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
と同様になりますが、キーと値の両方を設定する必要があります。setdefault
は MessageMaps
に対しては拒否されます。
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
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:
], and -[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 の使用を完全に禁止します。MSVC は引き続き CMake でサポートし、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 強制を一貫させるための修正が含まれています。文字列フィールドに不正な非 UTF-8 データを持つユーザーは、UTF-8 強制エラーがより早く表面化する可能性があります。
JSON 解析における Ruby と PHP のエラー
v30 では、JSON 仕様に従って、数値フィールド内の文字列の JSON 解析における不適合が修正されます。
この修正にはメジャーバージョンの引き上げは伴いませんが、Ruby と PHP は数値フィールド内の非数値文字列 (例: "", "12abc", "abc") に対してエラーを発生させるようになります。v29.x には、これらのエラーケースに対する警告が含まれます。