バージョン 26.x のニュース発表
以下の発表は、2024年3月13日にリリースされたバージョン26.xに特化したものです。時系列の情報については、ニュースを参照してください。
一般的な変更点
JSON フォーマッタオプションの変更
26.x シリーズ以降、JSON フォーマッタオプションのデフォルト値のフィールドを印刷する機能は、proto2 と proto3 の optional
フィールドを一貫して処理するための固定された方法に置き換えられます。
- Java:
includingDefaultValueFields()
はalwaysPrintFieldsWithNoPresence()
に置き換えられます。 - C++:
always_print_default_values
はalways_print_fields_with_no_presence=True
に置き換えられます。 - Py:
including_default_value_fields=True
はalways_print_fields_with_no_presence=True
に置き換えられます。
新しいフラグは、proto3 メッセージでは古いフラグとまったく同じ動作をしますが、proto2 の optional
フィールドには適用されなくなります。古いフラグは proto2 の optional
フィールドには適用されましたが、proto3 の optional
フィールドには適用されませんでした。
Gencode / ランタイムの不一致のポイズンピル
クロスバージョンランタイム保証に従い、Protobuf は、メジャーバージョン境界を越えた生成コードとランタイムの混合、または単一のメジャーランタイムバージョン内で新しいバージョンの protoc からの生成コードと古いランタイムの混合をサポートしていません。これらの許可されていない不一致を検出して強制するために「ポイズンピル」を導入する予定です。
これは既存のポリシーの強制を追加するだけなので、破壊的変更とは見なされませんが、ユーザーは生成コードを更新する必要がある場合があります。
C++ の破壊的変更
v26 では、破壊的変更ポリシーとバージョンサポートポリシーに従い、C++ のメジャーバージョンアップを計画しています。
以下のセクションでは、Protocol Buffers の 26.0 リリースに含める予定の一連の破壊的変更について概説します。計画は変更される可能性があることに注意してください。これらは潜在的な破壊的変更であり、認識しておくべきですが、この特定のリリースで発生しないか、まったく発生しない可能性があります。
繰り返しフィールドの非推奨の clear API を削除
以下の非推奨メソッドは削除されます
RepeatedPtrField::ReleaseCleared()
RepeatedPtrField::ClearedCount()
RepeatedPtrField::AddCleared()
C++ レガシー構文記述子 API を削除
エディションのリリースにより、構文はビジネスロジックでサポートされなくなりました。代わりに、descriptor.h
で定義されているさまざまな機能ヘルパーを使用して、C++ の機能をクエリするために、has_presence
のようなよりターゲットを絞った動作をクエリしてください。
非推奨の構文アクセサーを削除
v26 で非推奨の構文アクセサー FileDescriptor::Syntax
を削除する予定です。代わりに FileDescriptor::edition
からゲッターを使用することをお勧めします。
非推奨の SupportsUnknownEnumValues メソッドを削除
SupportsUnknownEnumValues
メソッドは2023年3月に非推奨になりました。v26 で削除する予定です。
std::string エラーコレクターのオーバーライドを削除
エラーコレクター内の非推奨の std::string
メソッドを削除する予定です。
Java の破壊的変更
v26 では、破壊的変更ポリシーおよびバージョンサポートポリシーに従い、Java のメジャーバージョンアップを計画しています。
以下のセクションでは、Protocol Buffers の 26.0 リリースに含める予定の一連の破壊的変更について概説します。計画は変更される可能性があることに注意してください。これらは潜在的な破壊的変更であり、認識しておくべきですが、この特定のリリースで発生しないか、まったく発生しない可能性があります。
古い生成コードとの互換性を破る変更
v26.x は、古いメジャーバージョンからの生成コードとの互換性を破ります。ユーザーは、古い生成コードを同じバージョンから再生成する必要があります。
例えば、元々 v2.x.x から v3.x.x ランタイムへの生成コードとの後方互換性のために導入された GeneratedMessageV3
は、GeneratedMessage
に名前が変更されます。ランタイムはエディションをサポートするように更新され、これは古い生成コードと互換性がありません。
これは既存のクロスバージョンランタイム保証に従ったものであり、破壊的変更です。
非推奨のメソッド/変数の削除
v26.x では、非推奨のメソッドと変数へのアクセスが削除されます。これらは通常、以前のリリースで既に @Deprecated
とマークされています。
これにより、以下の網羅的ではないリストへのアクセスが削除されます
記述子構文 API。これらは対応する機能アクセサー (例:
FieldDescriptor.hasPresence()
、EnumDescriptor.isClosed()
) に置き換えられるべきです。TextFormat print メソッド。これらは対応する
TextFormat.printer()
メソッドに置き換えられるべきです。PARSER 変数。これは
parser()
メソッドに置き換えられるべきです。古い v2.x.x gencode 互換性のためのランタイムメソッド。これは、クロスバージョンランタイム保証に従い、サポートされなくなりました。
詳細については、対応するリリースノートで確認できます。
PHP の破壊的変更
26.x ラインで以下の変更が計画されています。
- セッターで文字列フィールドの UTF-8 を検証。
- 汎用サービスを削除。( コミット 40ad3fa )
Python の破壊的変更
v26 では、破壊的変更ポリシーおよびバージョンサポートポリシーに従い、Python のメジャーバージョンアップを計画しています。
26.x ラインで以下の変更が計画されています。
str(msg)
が文字列フィールド内の無効な UTF-8 をエスケープするように変更します。text_format.MessageToString()
のデフォルト出力が生の UTF-8 になり、無効な UTF-8 シーケンスをエスケープするように変更します。- タイムスタンプの境界を修正 (コミット 1250d5f)
非推奨の API の削除
26.x リリースでは、以下の非推奨 API が削除されます。
繰り返しフィールドの None Iterable による拡張を拒否
26.x リリース以降、繰り返しフィールドを None
のイテラブルで拡張することは拒否されます (TypeError
が発生します)。たとえば、m.repeated_int32.extend(None)
は拒否されます。
メッセージクラスからの RegisterExtension の削除
26.x リリース以降、RegisterExtension
は削除されます。Python で拡張機能にアクセスするには、メッセージオブジェクトの Extensions
プロパティを使用できます。
これは純粋な Python と Python の C++ 実装の両方に影響しますが、upb Python には影響しません。
GitHub からの setup.py
および setup.cfg
のサポートの削除
26.x リリースでは、GitHub リポジトリの python/
ディレクトリまたは GitHub リリース tarball に setup.py
および setup.cfg
は存在しなくなります。これは、GitHub リポジトリまたはリリース tarball から直接 Python パッケージをビルドすることができなくなることを意味します。
PyPI に公開されている Python ソースパッケージには、トップレベルディレクトリに setup.py
が引き続き存在します。これは、PyPI で配布されているバイナリパッケージを使用しないユーザー向けの、Python バイナリパッケージをビルドするためのサポートされ推奨される方法です。
詳細については、#15671 を参照してください。
タイムスタンプの有効性チェック
v26 では、システムは Timestamp
値が有効であるかどうかをチェックします。秒数は [-62135596800, 253402300799] の範囲内である必要があり、ナノ秒は [0, 999999999] の範囲内である必要があります。これらの範囲外の値は例外を発生させます。
非推奨の構文アクセサーを削除
v26 で非推奨の構文アクセサー FileDescriptor.syntax
を削除し、代わりに FileDescriptor.edition
を追加する予定です。
UnknownFields サポートの削除
v25 では、純粋な Python と C++ 拡張機能でmessage.UnknownFields()
が非推奨になりました。v26 で削除する予定です。代わりに unknown_fields.py
の新しいUnknownFieldSet(message)
サポートを使用してください。
これらの変更の詳細については、対応するリリースノートで確認できます。
Rubyの破壊的変更
RepeatedField#each_index
が正しいセマンティクスを持つように修正。( #11767 )- Ruby DSL および関連する互換性コードを削除。これにより、4月に発表された移行が完了します。
Message#to_h
の修正- 未設定の oneof フィールドを削除。( #6167 )
- 未設定のサブメッセージフィールドを削除
encode_json
/decode_json
にメッセージのプールを使用。- 非推奨の構文アクセサー
FileDescriptor.syntax
を削除し、代わりにセマンティックチェックを追加。FieldDescriptor.has_presence
でフィールドに存在があるかどうかをテスト。FieldDescriptor.is_packed
で繰り返しフィールドがパックされているかどうかをテスト。FieldDescriptor.requires_utf8_validation
で文字列フィールドが UTF-8 検証を必要とするかどうかをテスト。EnumDescriptor.is_closed
で enum が閉じているかどうかをテスト。
Ruby の Freeze が再帰的になる
26.x ライン以降、freeze が適用されると、すべてのサブメッセージ、マップ、繰り返しフィールドに影響を与え、再帰的に適用されます。
upb の破壊的変更
26.x ラインで以下の変更が計画されています。
IgnoreUnknownEnumString
が有効な場合、JSON パースにおける非準拠を修正。