Änderungen angekündigt am 14. Juli 2025

Für Protocol Buffers angekündigte Änderungen am 14. Juli 2025.

Deprecation von FieldDescriptor Enums

Wir kündigen eine bevorstehende Änderung bezüglich des FieldDescriptor-Enums und seiner zugehörigen Werte für optional, erforderlich und wiederholt an. Diese werden als veraltet markiert, da wir die Verwendung präziserer Zugriffsmethoden empfehlen.

Hintergrund

Obwohl das FieldDescriptor.label-Enum einst seinen Zweck erfüllte, hat die Weiterentwicklung von Protocol Buffers idiomatischere Wege zur Bestimmung der Kardinalität (einzeln/wiederholt) und der Präsenzsemantik eines Feldes eingeführt.

  • In proto2 sind optional, required und repeated explizite Schlüsselwörter.
  • In proto3 wird required nicht mehr unterstützt. Alle Skalarfelder sind implizit "optional" in dem Sinne, dass sie Standardwerte haben, wenn sie nicht gesetzt sind. Das optional-Schlüsselwort wurde später in proto3 wieder eingeführt, um die Präsenz für Skalarfelder explizit zu verfolgen (Unterscheidung zwischen einem nicht gesetzten Feld und einem Feld, das auf seinen Standardwert gesetzt ist).
  • In der Edition 2023 haben wir die Schlüsselwörter optional und required entfernt und Funktionen zur Steuerung dieser Verhaltensweisen verwendet.

Das label-Enum vermischt diese unterschiedlichen Konzepte (Kardinalität, Erforderlichkeit und explizite Präsenzverfolgung), was zu potenziellen Verwirrungen führt, insbesondere mit dem Präsenzmodell für Felder in proto3.

Auswirkungen und Migration

Das Feld FieldDescriptor.label wird schließlich aus der API entfernt.

Beachten Sie, dass die Methodennamen in diesem Thema in einigen Sprachen geringfügig anders geschrieben sein können.

  • Für Protocol Buffer Editions Felder
    • Wichtige Methoden für Editionen
      • hasPresence wird zur primären Methode, um zu bestimmen, ob ein einzelnes Feld die Präsenz verfolgt, und spiegelt die Einstellung features.field_presence für dieses Feld wider.
    • Migration: Verlassen Sie sich auf isRepeated und isRequired für die Kardinalität und hasPresence, um die explizite Präsenzverfolgung bei einzelnen Feldern zu überprüfen.
  • Für proto2/proto3 Felder: getLabel wird schließlich entfernt und ist derzeit nicht zu empfehlen.

Alle Benutzer von Protocol Buffers, die mit FieldDescriptor-Objekten in ihrem Code interagieren (z. B. für Code-Generierung, Reflexion und dynamische Nachrichtenbehandlung), sollten davon absehen, FieldDescriptor.label direkt zu verwenden.

Aktualisieren Sie stattdessen Ihren Code, um die folgenden Methoden zu verwenden

  • Um zu überprüfen, ob ein Feld wiederholt ist: field.isRepeated
  • Um zu überprüfen, ob ein Feld erforderlich ist (nur proto2 und Editionen): field.isRequired
  • Um zu überprüfen, ob ein einzelnes Feld explizite Präsenz hat, verwenden Sie hasPresence

Zeitplan

Diese Verfallsklausel tritt sofort in Kraft. Obwohl getLabel weiterhin funktioniert, empfehlen wir eine proaktive Migration Ihres Codes, um die zukünftige Kompatibilität und Klarheit zu gewährleisten. Diese Änderung wird zu einer robusteren und verständlicheren Erfahrung für Entwickler führen, die Protocol Buffers verwenden.