バージョン 30.x のニュース発表

Protocol Buffers バージョン 30.x について発表された変更点。

次の発表はバージョン 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 を修正して機密フィールドを編集

Protobuf デバッグ API (Protobuf AbslStringify、proto2::ShortFormatproto2::Utf8FormatMessage::DebugStringMessage::ShortDebugStringMessage::Utf8DebugString を含む) を v30 で修正し、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

代替: アリーナへの移行 (移行ガイド)。

JsonOptions

API: JsonOptions

代替: JsonPrintOptions

C++14 のサポートを終了

このリリースでは、最小サポートバージョンとして C++ 14 を削除し、Foundational C++ Support matrix に従って 17 に引き上げます。

ポリシー に基づき、これは破壊的変更とは見なされません。

アリーナ上の Oneof メッセージをクリアした後、ASAN ポイズニングを導入

この変更により、アリーナを使用する C++ protobuf に影響する強化チェックが追加されます。protobuf アリーナに割り当てられた Oneof メッセージは、デバッグモードでクリアされ、ASAN モードでポイズニングされるようになります。クリアを呼び出した後、メモリ領域を使用しようとすると、use-after-free エラーとして 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 エイリアスを削除します。

代わりに protobuf_deps.bzl を使用するために、system_python.bzl への直接参照を削除してください。直接参照が必要な場合は、v5.27.0 で移動 された python/dist/system_python.bzl を使用してください。

フィールドセッターのバリデーションの変更

v30 では、Python および upb のフィールドセッターが修正され、エディション 2023 でクローズド enum を検証するようになります。無効な値で更新されたクローズド enum フィールドはエラーを生成します。

非推奨の py_proto_library マクロを削除

非推奨の内部 py_proto_library Bazel マクロ (protobuf.bzl 内) が 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++ のみに存在し、もはやリリースされていません。ピュア 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:], および -[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 を使用することを完全に禁止します。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 強制を言語間で一貫させるための修正が含まれています。文字列フィールドに UTF-8 でない不正なデータが含まれているユーザーは、UTF-8 強制エラーが以前よりも早く表面化する可能性があります。

JSON パースにおける Ruby および PHP のエラー

v30 では、JSON 仕様 に従って、数値フィールドの文字列の JSON パースにおける非準拠を修正します。

この修正にはメジャーバージョンの変更は伴いませんが、Ruby と PHP は数値フィールドで非数値文字列 (例: ""、"12abc"、"abc") に対してエラーを発生させるようになります。v29.x には、これらのエラーケースに関する警告が含まれます。