バージョン 30.x のニュースとお知らせ

Protocol Buffers バージョン 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::ShortFormatproto2::Utf8FormatMessage::DebugStringMessage::ShortDebugStringMessage::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.ParseMessagereflection.MakeClass

代替: message_factory.GetMessageClass()

RPCサービスインターフェース

API: service.RpcExceptionservice.Serviceservice.RpcController、および service.RpcChannel

代替: バージョン2.3.0以降、RPC実装はこれらをベースに構築しようとせず、代わりに特定のRPC実装に固有のコードを生成するコードジェネレータプラグインを提供すべきです。

MessageFactoryおよびSymbolDatabaseメソッド

API: MessageFactory.GetPrototypeMessageFactory.CreatePrototypeMessageFactory.GetMessagesSymbolDatabase.GetPrototypeSymbolDatabase.CreatePrototype、および SymbolDatabase.GetMessages

代替: message_factory.GetMessageClass() および message_factory.GetMessageClassesForFiles()

GetDebugString

API: GetDebugString

代替

代替はありません。これはもはやリリースされていないPython C++にのみ存在します。Pure PythonやUPBではサポートされていません。

Python のマップフィールドに対する setdefault の動作変更

v30 以降、setdefaultScalarMap に対して dict と同様になりますが、キーと値の両方を設定する必要があります。setdefaultMessageMaps に対しては拒否されます。

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: +[GPBEnumDescriptor allocDescriptorForName:valueNames:values:count:enumVerifier:extraTextFormatInfo:]

代替: ライブラリの最新バージョンで再生成してください。

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 には、これらのエラーケースに対する警告が含まれます。