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

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

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

C++の変更点

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

Descriptor API

v30では、descriptor内の戻り値の型(full_nameなど)をabsl::string_viewに更新します。これにより、descriptorのメモリを節約できます。

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のフィールドセッターが修正され、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.GetPrototype, MessageFactory.CreatePrototype, MessageFactory.GetMessages, SymbolDatabase.GetPrototype, SymbolDatabase.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の強制をすべての言語で一貫させる修正が含まれています。文字列フィールドに不正な非UTF8データを持つユーザーは、UTF-8強制エラーがより早く表面化する可能性があります。