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

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

以下の発表は、2024年3月13日にリリースされたバージョン26.xに特化したものです。時系列の情報については、ニュースを参照してください。

一般的な変更点

JSON フォーマッタオプションの変更

26.x シリーズ以降、JSON フォーマッタオプションのデフォルト値のフィールドを印刷する機能は、proto2 と proto3 の optional フィールドを一貫して処理するための固定された方法に置き換えられます。

  • Java: includingDefaultValueFields()alwaysPrintFieldsWithNoPresence() に置き換えられます。
  • C++: always_print_default_valuesalways_print_fields_with_no_presence=True に置き換えられます。
  • Py: including_default_value_fields=Truealways_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 リリース tarballsetup.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 パースにおける非準拠を修正。