2024年11月7日 変更点
以下のセクションでは、2025年第1四半期に予定されている v30 リリースで計画されている破壊的変更について説明します。また、破壊的ではないものの、ユーザー側での対応が必要となる可能性のある変更も含まれています。これらは、10月2日のニュース記事で言及された変更に加えてのものです。
これらは、実装が予想される変更について説明していますが、ソフトウェアの柔軟な性質により、これらの変更の一部は実現しないか、またはこのトピックで説明されている内容と異なる場合があります。
アリーナ上の oneof メッセージのクリア後の ASAN ポイズニングの導入
この変更は、アリーナを使用する C++ protobuf に影響を与える強化チェックを追加します。protobuf アリーナに割り当てられた oneof メッセージは、デバッグモードでクリアされ、ASAN モードでポイズンされるようになります。clear を呼び出した後、そのメモリ領域を今後使用しようとすると、use-after-free エラーとして ASAN でクラッシュが発生します。
この実装には C++17 が必要です。
マップフィールドに対する Python setdefault の動作変更
v30 以降、setdefault
は ScalarMap
に対して 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 には、これらのエラーケースに対する警告が含まれます。