2024年11月7日に発表された変更点

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

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

これらは、実装が予定されている変更点を記述したものですが、ソフトウェアの柔軟な性質上、これらの変更点の一部は実装されないか、このトピックで記述されている内容と異なる場合があります。

アリーナ上のOneofメッセージをクリアした後、ASANポイズニングを導入

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

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

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

v30から、`setdefault`は`ScalarMap`の`dict`に似ていますが、キーと値の両方が設定されている必要があります。`MessageMaps`では`setdefault`は拒否されます。

非推奨のpy_proto_libraryマクロを削除

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

これは、v29.xから`bazel/py_proto_library`に移動される公式の`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では、これらのエラーケースに対して警告が含まれます。