バージョン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フィールドには適用されませんでした。

生成コード/ランタイム不一致におけるポイズンピルの導入

クロスバージョンランタイム保証に従い、Protobufは、メジャーバージョン間で生成コードとランタイムを混在させること、または単一のメジャーランタイムバージョン内で新しいバージョンのprotocから生成されたコードを古いランタイムと混在させることをサポートしていません。これらの許可されない不一致を検出し、強制するために「ポイズンピル」を導入する予定です。

これは既存のポリシーの強制を追加するだけなので、破壊的変更とは見なされませんが、ユーザーは生成コードを更新する必要がある場合があります。

C++の破壊的変更

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

以下のセクションでは、Protocol Buffersの26.0リリースに含める予定の破壊的変更のセットを概説します。計画は変更される可能性があり、実際に変更されることもあります。これらは認識しておくべき潜在的な破壊的変更ですが、この特定のリリースで発生しないか、全く発生しない可能性もあります。

繰り返しフィールドの非推奨clear APIの削除

以下の非推奨メソッドが削除されます。

  • RepeatedPtrField::ReleaseCleared()
  • RepeatedPtrField::ClearedCount()
  • RepeatedPtrField::AddCleared()

C++レガシー構文ディスクリプタAPIの削除

エディションのリリースにより、構文はビジネスロジックではサポートされなくなりました。代わりに、C++で機能をクエリするために、descriptor.hで定義されている様々な機能ヘルパー(例: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とマークされています。

これにより、以下の非網羅的なリストへのアクセスが削除されます。

  • 対応する機能アクセサー(FieldDescriptor.hasPresence()EnumDescriptor.isClosed()など)に置き換えられるべきDescriptor構文API。

  • 対応するTextFormat.printer()メソッドに置き換えられるべきTextFormat印刷メソッド。

  • parser()メソッドに置き換えられるべきPARSER変数。

  • 古いv2.x.x生成コードの互換性のためのランタイムメソッド。これは、クロスバージョンランタイム保証に従い、もはやサポートされません。

詳細については、対応するリリースノートで確認できます。

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リポジトリまたはGitHubリリースtarボールpython/ディレクトリにsetup.pyおよびsetup.cfgが存在しなくなります。これは、GitHubリポジトリまたはリリースtarボールから直接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ラインで以下の変更が計画されています。