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以降、setdefaultScalarMapdictと同様になりますが、キーと値の両方を設定する必要があります。MessageMapsではsetdefaultは拒否されます。

非推奨のpy_proto_libraryマクロを削除

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

これは、v29.x以降、bazel/py_proto_library内のprotobufに移動される公式のpy_proto_libraryに置き換えられるべきです。この実装は、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では、これらのエラーケースに対して警告が含まれます。