2024年10月2日に発表された変更

2024年10月2日にProtocol Buffersに関して発表された変更点です。

以下のセクションでは、2025年第1四半期に予定されているv30リリースでの計画的な破壊的変更について説明します。これらは、実装が予想される変更点を記述していますが、ソフトウェアの柔軟な性質により、これらの変更の一部は実施されないか、このトピックでの記述とは異なる場合があります。

C++での変更

C++はメジャーバージョンを5.29.xから6.30.xに引き上げます。

ディスクリプタAPI

v30では、ディスクリプタ(full_nameなど)の戻り値の型がabsl::string_viewに更新されます。これにより、ディスクリプタのメモリ節約が可能になります。

v28で導入されたPROTOBUF_FUTURE_STRING_VIEW_RETURN_TYPEマクロを使用すると、破壊的変更リリースに先立って、更新された戻り値の型を有効にできます。v30リリースでは、デフォルトが反転し、このマクロは削除されます。

FieldDescriptor オプションから ctype を削除

v30では、FieldDescriptorオプションからのctypeの公開を停止します。代わりに、v28リリースで追加されたFieldDescriptor::cpp_string_type() APIを使用できます。

CMake のサブモジュールをフェッチされた依存関係に置き換え

v30では、サブモジュールを削除し、依存関係をフェッチするupbの古いCMakeパターンに切り替えます。

インストールされたパッケージを使用している場合、影響はありません。一部のCMakeワークフローが壊れる可能性があります。

非推奨APIの削除

v30では、少なくとも1つのマイナーまたはメジャーリリースで非推奨(ABSL_DEPRECATEDなど)とマークされており、廃止または置換された以下の公開ランタイムAPIを削除します。

Arena::CreateMessage

API: Arena::CreateMessage

代替: Arena::Create

Arena::GetArena

API: Arena::GetArena

代替: value->GetArena()

RepeatedPtrField::ClearedCount

API: RepeatedPtrField::ClearedCount

代替: Arenaに移行してください(移行ガイド)。

JsonOptions

API: JsonOptions

代替: JsonPrintOptions

C++14サポートの終了

このリリースでは、Foundational C++ Support matrixに従い、サポートする最小バージョンとしてC++ 14を廃止し、17に引き上げます。

私たちのポリシーに基づき、これは破壊的変更とは見なしません。

JRubyでの変更

v30では、JRubyのデフォルト実装がFFIに切り替わります。これは一部のJRubyユーザーにとって破壊的変更となる可能性があります。

JRubyは公式にはサポートされていないため、この変更はRubyのメジャーバージョンアップにはなりません。

Pythonでの変更

Pythonはメジャーバージョンを5.29.xから6.30.xに引き上げます。

Python 3.8サポートの終了

公式のPythonサポートポリシーに従い、Python 3.8以下のサポートを終了します。これにより、サポートされる最小のPythonバージョンは3.9になります。

bazel/system_python.bzl エイリアスの削除

v30では、レガシーなbazel/system_python.bzlエイリアスを削除します。

system_python.bzlへの直接参照を削除し、代わりにprotobuf_deps.bzlを使用してください。直接参照が必要な場合は、v5.27.0で移動されたpython/dist/system_python.bzlを使用してください。

フィールドセッターの検証に関する変更

v30では、Pythonとupbのフィールドセッターが修正され、edition 2023下でクローズドenumを検証するようになります。無効な値で更新されたクローズドenumフィールドはエラーを生成します。

非推奨APIの削除

v30では、少なくとも1つのマイナーまたはメジャーリリースで非推奨とマークされており、廃止または置換された以下の公開ランタイムAPIを削除します。

リフレクションメソッド

API: reflection.ParseMessagereflection.MakeClass

代替: message_factory.GetMessageClass()

RPCサービスインターフェース

API: service.RpcExceptionservice.Serviceservice.RpcController、およびservice.RpcChannel

代替: バージョン2.3.0以降、RPC実装はこれらをベースに構築しようとせず、代わりに特定のRPC実装に固有のコードを生成するコードジェネレータプラグインを提供すべきです。

MessageFactoryおよびSymbolDatabaseメソッド

API: MessageFactory.GetPrototypeMessageFactory.CreatePrototypeMessageFactory.GetMessagesSymbolDatabase.GetPrototypeSymbolDatabase.CreatePrototype、およびSymbolDatabase.GetMessages

代替: message_factory.GetMessageClass() および message_factory.GetMessageClassesForFiles()

GetDebugString

API: GetDebugString

代替

代替はありません。これはもはやリリースされていないPython C++にのみ存在します。Pure PythonやUPBではサポートされていません。

Objective-Cでの変更

これはObjective-Cにとって初の破壊的リリースとなります。.

Objective-Cはメジャーバージョンを3.x.xから4.30.xに引き上げます。

未知のフィールド処理APIを全面的に見直し、既存APIのほとんどを非推奨に

v30では、GPBUnknownFieldSetが非推奨となり、GPBUnknownFieldsに置き換えられます。新しい型は、元の入力またはAPI呼び出しからの未知のフィールドの順序を保持し、メッセージが書き戻される際に順序に関する意味が維持されることを保証します。

これの一環として、GPBUnknownField型のAPIも変更され、既存のAPIのほとんどが非推奨となり、新しいAPIが追加されます。

非推奨のプロパティAPI

  • varintList
  • fixed32List
  • fixed64List
  • lengthDelimitedList
  • groupList

非推奨の変更API

  • addVarint
  • addFixed32
  • addFixed64
  • addLengthDelimited
  • addGroup

非推奨のイニシャライザ initWithNumber:

新しいプロパティAPI

  • type
  • varint
  • fixed32
  • fixed64
  • lengthDelimited
  • group

この型は、特定のフィールド番号のすべての値をグループ化するのではなく、その値に含まれる単一のフィールド番号をモデル化します。新しいフィールドを作成するためのAPIは、GPBUnknownFieldsクラスのadd* APIです。

v30では、-[GPBMessage unknownFields]も非推奨になります。代わりに、メッセージの未知のフィールドを抽出および更新するための新しいAPIが提供されます。

非推奨APIの削除

v30では、少なくとも1つのマイナーまたはメジャーリリースで非推奨とマークされており、廃止または置換された以下の公開ランタイムAPIを削除します。

GPBFileDescriptor

API: -[GPBFileDescriptor syntax]

代替: 廃止されました。

GPBMessage mergeFrom:extensionRegistry

API: -[GPBMessage mergeFrom:extensionRegistry:]

代替: -[GPBMessage mergeFrom:extensionRegistry:error:]

GPBDuration timeIntervalSince1970

API: -[GPBDuration timeIntervalSince1970]

代替: -[GPBDuration timeInterval]

GPBTextFormatForUnknownFieldSet

API: GPBTextFormatForUnknownFieldSet()

代替: 廃止されました - 未知のフィールドを含むGPBTextFormatForMessage()を使用してください。

GPBUnknownFieldSet

API: GPBUnknownFieldSet

代替: GPBUnknownFields

GPBMessage unknownFields

API: GPBMessage unknownFieldsプロパティ

代替: -[GPBUnknownFields initFromMessage:]-[GPBMessage mergeUnknownFields:extensionRegistry:error:]、および-[GPBMessage clearUnknownFields]

古いgencodeのための非推奨ランタイムAPIを削除

このリリースでは、3.22.xリリース以前のObjective-C gencodeをサポートする非推奨のランタイムメソッドが削除されます。また、ライブラリは古い生成コードが起動する際に実行時ログメッセージを出力します。

API: +[GPBFileDescriptor allocDescriptorForClass:file:fields:fieldCount:storageSize:flags:]

代替: ライブラリの最新バージョンで再生成してください。

API: +[GPBFileDescriptor allocDescriptorForClass:rootClass:file:fields:fieldCount:storageSize:flags:]

代替: ライブラリの最新バージョンで再生成してください。

API: +[GPBEnumDescriptor allocDescriptorForName:valueNames:values:count:enumVerifier:]

代替: ライブラリの最新バージョンで再生成してください。

API: +[GPBEnumDescriptor allocDescriptorForName:valueNames:values:count:enumVerifier:extraTextFormatInfo:]

代替: ライブラリの最新バージョンで再生成してください。

API: -[GPBExtensionDescriptor initWithExtensionDescription:]

代替: ライブラリの最新バージョンで再生成してください。

その他の変更

これらの破壊的変更に加えて、注目すべき他の変更点がいくつかあります。以下は破壊的変更とは見なされませんが、ユーザーに影響を与える可能性があります。

ポイズンピルの警告

v30では、ポイズンピルが更新され、新しいローリングアップグレードポリシーの下で機能するが、のメジャーバージョンアップで壊れる古いgencodeと新しいランタイムの組み合わせに対して警告を発するようになります。例えば、Java 4.x.xのgencodeは5.x.xのランタイムに対しては動作しますが、6.x.xのランタイムでは将来的に壊れるという警告が表示されます。

C#とRubyにおけるUTF-8強制の変更

v30には、言語間でUTF-8の強制を一致させる修正が含まれます。文字列フィールドに不正な非UTF-8データを持つユーザーは、UTF-8強制エラーがより早い段階で表面化する可能性があります。