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

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

以下の発表はバージョン 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 で定義されているさまざまな機能ヘルパーを使用して、has_presence などのよりターゲットを絞った動作をクエリして、C++ の機能をクエリします。

非推奨の構文アクセサーを削除

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 を検証します。
  • 汎用サービスを削除します。((commit 40ad3fa

Python の破壊的変更

v26 では、当社の破壊的変更ポリシーおよびバージョンサポートポリシーに従い、Python のメジャーバージョンアップを計画しています。

以下の変更が 26.x ラインで計画されています

  • str(msg) が文字列フィールドの無効な UTF-8 をエスケープするようにします。
  • text_format.MessageToString() がデフォルトで生の UTF-8 を出力し、無効な UTF-8 シーケンスをエスケープするようにします。
  • タイムスタンプの境界を修正します(commit 1250d5f

非推奨の API を削除

26.x リリースでは、以下の非推奨 API が削除されます

None イテラブルによる繰り返しのフィールドの拡張を拒否

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 リリースでは、setup.py および setup.cfg は、GitHub リポジトリまたは GitHub リリース tarballpython/ ディレクトリに存在しなくなります。これは、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
    • 文字列フィールドに UTF-8 検証が必要かどうかをテストする FieldDescriptor.requires_utf8_validation
    • enum が閉じているかどうかをテストする EnumDescriptor.is_closed

Ruby での freeze が再帰的になりました

26.x ラインから、freeze が適用されると、すべてのサブメッセージ、マップ、および繰り返しのフィールドに再帰的に適用されます。

upb の破壊的変更

以下の変更が 26.x ラインで計画されています