バージョン 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::ShortFormat
、proto2::Utf8Format
、Message::DebugString
、Message::ShortDebugString
、Message::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 以降、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:
], および -[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 強制を言語間で一貫させるための修正が含まれています。文字列フィールドに UTF-8 でない不正なデータが含まれているユーザーは、UTF-8 強制エラーが以前よりも早く表面化する可能性があります。
JSON パースにおける Ruby および PHP のエラー
v30 では、JSON 仕様 に従って、数値フィールドの文字列の JSON パースにおける非準拠を修正します。
この修正にはメジャーバージョンの変更は伴いませんが、Ruby と PHP は数値フィールドで非数値文字列 (例: ""、"12abc"、"abc") に対してエラーを発生させるようになります。v29.x には、これらのエラーケースに関する警告が含まれます。