2025年7月14日に発表された変更点

2025年7月14日にProtocol Buffersで発表された変更点。

FieldDescriptor Enumの非推奨化

FieldDescriptor enumおよび、optional、required、repeatedを表す関連する値について、今後の変更を発表します。より正確なアクセサーメソッドの使用を推奨するため、これらは非推奨になります。

背景

FieldDescriptor.label enumがかつて目的を果たしていた一方で、Protocol Buffersの進化により、フィールドのカーディナリティ(単数/繰り返し)と存在セマンティクスを決定する、より慣用的な方法が導入されました。

  • proto2では、optionalrequiredrepeatedは明示的なキーワードです。
  • proto3では、requiredはサポートされなくなりました。すべてのスカラーフィールドは、設定されていない場合にデフォルト値を持つという意味で、暗黙的に「optional」です。optionalキーワードは、後にproto3で、スカラーフィールドの存在を明示的に追跡するために再導入されました(設定されていないフィールドと、デフォルト値に設定されたフィールドを区別するため)。
  • edition 2023では、optionalおよびrequiredキーワードを削除し、それらの動作を制御するために機能を使用しています。

label enumは、これらの異なる概念(カーディナリティ、必須性、明示的な存在追跡)を混同し、特にproto3のフィールド存在モデルでは混乱を招く可能性があります。

影響と移行

FieldDescriptor.labelフィールドは、最終的にAPIから削除されます。

このトピックのメソッド名は、言語によっては若干異なるスペルになる場合があることに注意してください。

  • Protocol Buffer Editionsのフィールドの場合
    • Editionsの主要メソッド
      • hasPresenceは、単数フィールドがプレゼンスを追跡するかどうかを判断する主要なメソッドとなり、そのフィールドのfeatures.field_presence設定を反映します。
    • 移行: カーディナリティにはisRepeatedisRequiredを、単数フィールドの明示的なプレゼンス追跡の確認にはhasPresenceを使用してください。
  • proto2/proto3フィールドの場合: getLabelは最終的に削除される予定であり、その間も推奨されません。

コード内でFieldDescriptorオブジェクトとやり取りするProtocol Buffersのすべてのユーザー(コード生成、リフレクション、動的なメッセージ処理など)は、FieldDescriptor.labelを直接使用するのをやめるべきです。

代わりに、次のメソッドを使用するようにコードを更新してください。

  • フィールドが繰り返されるかどうかを確認するには: field.isRepeated
  • フィールドが必須であるかどうかを確認するには(proto2およびeditionsのみ): field.isRequired
  • 単数フィールドに明示的な存在があるかどうかを確認するには、hasPresenceを使用します。

タイムライン

この非推奨化は直ちに有効になります。getLabelは引き続き機能しますが、将来の互換性と明確性を確保するために、コードを積極的に移行することをお勧めします。この変更により、Protocol Buffersを使用する開発者にとって、より堅牢で理解しやすいエクスペリエンスがもたらされます。