バージョン 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::ShortFormat
、proto2::Utf8Format
、Message::DebugString
、Message::ShortDebugString
、Message::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 以降、setdefault
は ScalarMap
に対して 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: -[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 では、これらのエラーケースに対して警告が含まれます。