2024年11月7日 変更点

2024年11月7日に発表された Protocol Buffers の変更点。

以下のセクションでは、2025年第1四半期に予定されている v30 リリースで計画されている破壊的変更について説明します。また、破壊的ではないものの、ユーザー側での対応が必要となる可能性のある変更も含まれています。これらは、10月2日のニュース記事で言及された変更に加えてのものです。

これらは、実装が予想される変更について説明していますが、ソフトウェアの柔軟な性質により、これらの変更の一部は実現しないか、またはこのトピックで説明されている内容と異なる場合があります。

アリーナ上の oneof メッセージのクリア後の ASAN ポイズニングの導入

この変更は、アリーナを使用する C++ protobuf に影響を与える強化チェックを追加します。protobuf アリーナに割り当てられた oneof メッセージは、デバッグモードでクリアされ、ASAN モードでポイズンされるようになります。clear を呼び出した後、そのメモリ領域を今後使用しようとすると、use-after-free エラーとして ASAN でクラッシュが発生します。

この実装には C++17 が必要です。

マップフィールドに対する Python setdefault の動作変更

v30 以降、setdefaultScalarMap に対して dict と同様になりますが、キーと値の両方を設定する必要がある点が異なります。MessageMaps に対して setdefault は拒否されます。

非推奨の py_proto_library マクロを削除

非推奨の内部 py_proto_library Bazel マクロ (protobuf.bzl 内) は v30.x で削除されます。

これは公式の py_proto_library に置き換えられる予定です。公式版は v29.x 以降、bazel/py_proto_library 内の protobuf に移動されます。この実装は、v29.x より前の rules_python で以前から利用可能でした。

Python のネストされたメッセージクラス __qualname__ が外側のメッセージ名を含むように変更

Python のネストされたメッセージクラス __qualname__ が外側のメッセージ名を含むようになりました。v30 より前では、ネストされたメッセージの場合、__qualname____name__ と同じ結果になり、外側のメッセージ名は含まれていませんでした。

例:

message Foo {
  message Bar {
    bool bool_field = 1;
  }
}
nested = test_pb2.Foo.Bar()
self.assertEqual('Bar', nested.__class__.__name__)
self.assertEqual('Foo.Bar', nested.__class__.__qualname__) # It was 'Bar' before

C++ CocoaPods リリースをドロップ

v30 では、v4.x.x 以降壊れている C++ CocoaPods リリースをドロップします。C++ ユーザーは代わりに GitHub リリース を直接使用する必要があります。

JSON パース時の Ruby および PHP のエラー

v30 では、JSON 仕様 に基づき、数値フィールド内の文字列の JSON パースにおける非準拠を修正します。

この修正はメジャーバージョンアップを伴いませんが、Ruby と PHP は数値フィールド内の非数値文字列 (例: "", "12abc", "abc") に対してエラーを発生させるようになります。v29.x には、これらのエラーケースに対する警告が含まれます。