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を使用する開発者にとって、より堅牢で理解しやすい体験がもたらされます。