2025年9月19日に発表された変更点

2025年9月19日に発表された Protocol Buffers の変更点。

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

C++の変更点

C++ は、7.34.0 リリースでメジャーバージョンを 7 に上げます。6.33 が 6.x の最後のマイナーバージョンリリースとなります。

将来のマクロの削除

破壊的変更の段階的なロールアウトのために導入された以下のマクロは削除され、その動作がデフォルトとなります。

  • PROTOBUF_FUTURE_RENAME_ADD_UNUSED_IMPORT
  • PROTOBUF_FUTURE_REMOVE_ADD_IGNORE_CRITERIA
  • PROTOBUF_FUTURE_STRING_VIEW_DESCRIPTOR_DATABASE
  • PROTOBUF_FUTURE_NO_RECURSIVE_MESSAGE_COPY

新しい RepeatedPtrField レイアウト

RepeatedPtrField は、std::deque と同様に、要素が事前に割り当てられたメモリの連続したチャンクに格納される新しい内部要素レイアウトに移行します。これにより、一部の API のコピー/ムーブセマンティクスにいくつかの変更が生じ、一部の UnsafeArena API がアリーナセーフな対応物と機能的に同等になり、非推奨となる可能性があります。

RepeatedField::Get および RepeatedPtrField::Get の MSB 強化チェック

Protobuf は、繰り返しフィールドアクセスに包括的な範囲チェックを追加することで、OOB エラーに対する堅牢性を高めます。

Repeated フィールドからのアリーナポインタの削除

RepeatedPtrField(Arena*) コンストラクタは削除されます。

非推奨APIの削除

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

AddUnusedImportTrackFile() および ClearUnusedImportTrackFiles()

API: AddUnusedImportTrackFile(), ClearUnusedImportTrackFiles()

代替: AddDirectInputFile() および ClearDirectInputFiles()

メッセージ差分からの AddIgnoreCriteria

破壊的変更のために PROTOBUF_FUTURE_REMOVE_ADD_IGNORE_CRITERIA が追加されました。このリリースでは、このマクロを削除します。

API: AddIgnoreCriteria()

代替: 生ポインタを unique_ptr でラップします。

FieldDescriptor::has_optional_keyword()

API: FieldDescriptor::has_optional_keyword()

代替: has_presence()

FieldDescriptor::label()

API: FieldDescriptor::label()

代替: is_repeated() または is_required()

FieldDescriptor::is_optional()

API: FieldDescriptor::is_optional()

代替: !is_required() && !is_repeated()

UseDeprecatedLegacyJsonFieldConflicts()

API: UseDeprecatedLegacyJsonFieldConflicts()

代替: 代替なし。

より厳密な名前長の制限

protobuf コンパイラは、潜在的な問題を防止するため、フィールド名などのシンボル名の長さに、より厳密な制限を適用します。フィールド名の長さが 2^16 を超える場合、エラーを生成します。

CMake でプライベートジェネレーターヘッダーを非表示にする

protoc ジェネレーターヘッダーは CMake によってインストールされなくなります。これはほとんどのユーザーには影響しません。

論理的に定数な操作に対する [[nodiscard]]

[[nodiscard]] は、戻り値の消費に失敗するとバグの可能性を示す、いくつかの論理的に定数な protobuf API に追加されます。これは、C++ 標準ライブラリで一般的に使用されるパターンに従っています。

Pythonでの変更

Python は、7.34.0 リリースでメジャーバージョンを 7 に上げます。6.33 が 6.x の最後のマイナーバージョンリリースとなります。

gencode に変更はなく、ポイズンピルは緩和されます。7.34.x の古い生成ファイルに対して警告やエラーは発生しません。

Timestamp/Duration への誤った型変換に対する TypeError の発生

このリリースでは、誤った型を Timestamp または Duration に変換する際に、AttributeError の代わりに TypeError が発生します。

bool から enum および int フィールドへの代入を拒否

このリリースでは、ブール値で enum または int フィールドを設定することを拒否します。API は暗黙的に変換する代わりにエラーを発生させます。

json_format から float_precision を削除

このリリースでは、非推奨の float_precision オプションを json_format シリアライザから削除します。このオプションは他の ProtoJSON シリアライザには存在せず、意味が混乱を招くためです。

text_format から float_format/double_format を削除

このリリースでは、非推奨の float_format および double_format オプションを text_format から削除します。これらのオプションは他のプロトテキスト形式シリアライザでは利用できません。

非推奨APIの削除

このリリースでは、以下の公開ランタイムAPIが削除されます。

FieldDescriptor.label

API: FieldDescriptor.label

代替: is_repeated() または is_required() を使用します。

PHP の変更点

PHP は、5.34.0 リリースでメジャーバージョンを 5 に上げます。4.33 が 4.x の最後のマイナーバージョンリリースとなります。

非推奨APIの削除

このリリースでは、以下の公開ランタイムAPIが削除されます。

FieldDescriptor getLabel

API: FieldDescriptor getLabel

代替: isRepeated() または isRequired()

Google\Protobuf\Field_Kind

API: Google\Protobuf\Field_Kind

代替: Google\Protobuf\Field\Kind

Google\Protobuf\Field_Cardinality

API: Google\Protobuf\Field_Cardinality

代替: Google\Protobuf\Field\Cardinality

Google\Protobuf\Internal\RepeatedField

API: Google\Protobuf\Internal\RepeatedField

代替: Google\Protobuf\RepeatedField

JSON 解析の厳格化

JSONパーサーはより厳格になり、以前は受け入れられていたいくつかのケースを拒否します。これには、範囲外の値、整数フィールドの非整数数値、重複するoneofフィールド、文字列フィールドの非文字列値が含まれます。JSONシリアライザは、数値の InfinityNaN も拒否します。

デフォルト値の黙示的な無視を修正

PHPランタイムは、proto2およびエディションのスカラーフィールドのデフォルト値を黙示的に無視する代わりに、尊重するように修正されます。

型チェックの整合性

純粋PHPおよびupb-PHP実装の型チェックは整合されます。特に、純粋PHPは文字列フィールドの null を拒否し、upb-PHPの動作と一致します。

Objective-Cでの変更

Objective-C は、5.34.0 リリースでメジャーバージョンを 5 に上げます。4.33 が 4.x の最後のマイナーバージョンリリースとなります。

一部の GPB*Dictionary API の null 許容アノテーションが、API が nil を返す可能性がある場合にマークするように修正されます。これにより、Swift コードは Swift の Optional<T> を取得し、API の破壊的変更となります。Objective-C の呼び出し元にとっては、アノテーションの修正がソースコードに影響を与える可能性は低いです。

非推奨APIの削除

このリリースでは、以下の公開ランタイムAPIが削除されます。

-[GPBFieldDescriptor optional]

API: -[GPBFieldDescriptor optional]

代替: 代わりに !required && fieldType == GPBFieldTypeSingle を使用してください。

その他の変更

以下は追加の破壊的変更です。

Bazel: 非推奨の ProtoInfo.transitive_imports を削除

ProtoInfo の非推奨の transitive_imports フィールドは削除されます。ユーザーは transitive_sources に移行する必要があります。

protobuf_allow_msvc フラグを削除し、Bazel+MSVC のサポートを継続

Bazel の Windows における最近の改善により、Bazel+MSVC のサポートを継続する予定です。--define=protobuf_allow_msvc フラグは削除されます。

メジャーバージョンアップのない言語

Java、Ruby、C#、Rust、JRuby は、このリリースではメジャーバージョンアップはありません。