バージョン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++のメジャーバージョンアップを計画しています。

以下のセクションでは、プロトコルバッファの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のメジャーバージョンアップを計画しています。

以下のセクションでは、プロトコルバッファの26.0リリースに含める予定の破壊的変更のセットを概説します。計画は変更される可能性があり、実際に変更されます。これらは注意すべき潜在的な破壊的変更ですが、この特定のリリースで発生しない可能性や、まったく発生しない可能性もあります。

古い生成コードとの互換性の破壊

v26.xは、古いメジャーバージョンからの生成コードとの互換性を破棄します。ユーザーは、古い生成コードを同じバージョンから再生成する必要があります。

例えば、元々v2.x.xからの生成コードとv3.x.xランタイムとの後方互換性のために導入されたGeneratedMessageV3は、GeneratedMessageに改名されます。ランタイムは「エディション」をサポートするように更新され、古い生成コードとは互換性がなくなります。

これは既存の「クロスバージョンランタイム保証」に準拠しており、破壊的変更です。

非推奨のメソッド/変数の削除

v26.xでは、非推奨のメソッドと変数へのアクセスを削除します。これらは通常、以前のリリースで既に@Deprecatedとマークされています。

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

  • 対応する機能アクセサー(例: FieldDescriptor.hasPresence()EnumDescriptor.isClosed())に置き換えるべきディスクリプタ構文API

  • 対応するTextFormat.printer()メソッドに置き換えるべきTextFormatのprintメソッド

  • 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が削除されます

繰り返しフィールドへのiterable以外の拡張を拒否

26.xリリースから、繰り返しフィールドをNoneのiterableで拡張することは拒否されます(TypeErrorが発生します)。例えば、m.repeated_int32.extend(None)は拒否されます。

メッセージクラスからのRegisterExtensionの削除

26.xリリースから、RegisterExtensionは削除されます。Pythonで拡張機能にアクセスするには、メッセージオブジェクトのExtensionsプロパティを使用できます。

これは純粋なPythonとC++によるPythonの実装の両方に影響しますが、upb Pythonには影響しません。

GitHubからのsetup.pyおよびsetup.cfgサポートの削除

26.xリリースでは、GitHubリポジトリpython/ディレクトリまたはGitHubのリリースターボールsetup.pysetup.cfgは存在しなくなります。これは、GitHubリポジトリまたはリリースターボールから直接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で列挙型が閉じているかテストします。

RubyでFreezeが再帰的になる

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

upbの破壊的変更

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

  • IgnoreUnknownEnumStringが有効な場合のJSON解析における非準拠を修正しました。