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

Protocol Buffers バージョン 30.x で発表された変更点。

以下の発表はバージョン 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 を変更して機密フィールドを編集(Redact)する

v30 では、Protobuf デバッグ API(Protobuf AbslStringify、proto2::ShortFormatproto2::Utf8FormatMessage::DebugStringMessage::ShortDebugStringMessage::Utf8DebugString を含む)を、debug_redact でアノテーションされた機密フィールドを編集(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 のサポート終了

本リリースでは、Foundational C++ サポートマトリックスに従い、C++ 14 の最小サポートバージョンを終了し、17 に引き上げます。

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

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

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

当社の公式 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 でエディション2023の下で閉じられたenumを検証するように修正されます。無効な値で更新された閉じられたenumフィールドはエラーを生成します。

非推奨の 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++ にのみ存在します。純粋な Python または UPB ではサポートされていません。

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

v30 以降、setdefaultScalarMap に対して 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

  • 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]

古い生成コード向けの非推奨ランタイム API の削除

本リリースでは、3.22.x リリース以前の Objective-C の生成コードをサポートする非推奨のランタイムメソッドが削除されます。また、古い生成コードが起動する際には、ライブラリからランタイムログメッセージが発行されます。

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 では、ポイズンピルが更新され、新しいローリングアップグレードポリシーの下で動作するものの、次期メジャーバージョンアップで破壊される古い生成コードと新しいランタイムの組み合わせについて警告を発するようになります。たとえば、Java 4.x.x の生成コードは 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 では、これらのエラーケースに対して警告が含まれます。