Änderungen angekündigt am 27. Juni 2025

Änderungen, die für Protocol Buffers am 27. Juni 2025 angekündigt wurden.

Edition 2024

Wir planen, Protobuf Edition 2024 in der Version 32.x im 3. Quartal 2025 zu veröffentlichen.

Diese beschreiben Änderungen, wie wir ihre Implementierung erwarten. Aufgrund der flexiblen Natur von Software können einige dieser Änderungen möglicherweise nicht umgesetzt werden oder von der hier beschriebenen Art abweichen.

Weitere Dokumentation zu Edition 2024 wird in Feature-Einstellungen für Editionen veröffentlicht, einschließlich Informationen zur Migration von Edition 2023.

Änderungen an bestehenden Funktionen

Dieser Abschnitt beschreibt alle bestehenden Funktionen, deren Standardeinstellungen sich in Edition 2024 ändern werden.

C++ string_type

Der Standardwert für die Funktion string_type, die ursprünglich in Edition 2023 veröffentlicht wurde, wird in Edition 2024 von STRING auf VIEW geändert.

Siehe features.(pb.cpp).string_type und String View APIs für weitere Informationen zu dieser Funktion und ihren Funktionswerten.

Neue Funktionen

Dieser Abschnitt beschreibt alle neuen Funktionen, die in Edition 2024 eingeführt werden.

enforce_naming_style

feature.enforce_naming_style ermöglicht die strenge Durchsetzung des Benennungsstils, um sicherzustellen, dass Protos standardmäßig rund-trip-fähig sind, mit einem Funktionswert, um die alte Benennungsweise zu verwenden.

default_symbol_visibility

Diese Funktion steuert, ob die Standard-Symbol-Sichtbarkeit von importierbaren Symbolen (wie Nachrichten und Aufzählungen) entweder

  • export: referenzierbar von anderen Protos über Importanweisungen
  • local: nicht referenzierbar außerhalb der aktuellen Datei

Der Standardfunktionswert EXPORT_TOP_LEVEL in Edition 2024 stellt sicher, dass Top-Level-Symbole standardmäßig exportiert werden, während geschachtelte Symbole standardmäßig lokal sind.

Dies kann zusammen mit den export und local Schlüsselwörtern verwendet werden, um die Symbol-Sichtbarkeit explizit zu annotieren, die ebenfalls in Edition 2024 hinzugefügt wurde.

Die Symbol-Sichtbarkeit steuert nur, welche Symbole aus anderen Proto-Dateien importiert werden können, wirkt sich aber nicht auf die Codegenerierung aus.

C++: enum_name_uses_string_view

Zuvor lieferten alle generierten Aufzählungstypen die folgende Funktion, um das Label aus einem Aufzählungswert zu erhalten, was erhebliche Kosten für die Erstellung von std::string-Instanzen zur Laufzeit verursacht.

const std::string& Foo_Name(int);

Der Standardfunktionswert in Edition 2024 migriert diese Signatur stattdessen, um absl::string_view zurückzugeben, um eine bessere Entkopplung der Speicherung und potenzielle Speicher-/CPU-Einsparungen zu ermöglichen.

absl::string_view Foo_Name(int);

Benutzer sollten ihren Code migrieren, um den neuen Rückgabetyp gemäß der Migrationsanleitung zu verarbeiten.

Siehe String View APIs für weitere Informationen.

Java: nest_in_file_class

Diese Funktion steuert, ob der Java-Generator die generierte Klasse in der Java-generierten Klassendatei verschachtelt.

Der Standardwert in Edition 2024 generiert Klassen standardmäßig in ihren eigenen Dateien, was auch das Standardverhalten der vorherigen java_multiple_files = true File Option ist. Dies ersetzt java_multiple_files, das in Edition 2024 entfernt wird.

Der Standard-Außenklassenname wird ebenfalls aktualisiert, um standardmäßig immer der Camel-Case-konforme .proto-Dateiname mit der Endung Proto zu sein (z. B. foo/bar_baz.proto -> BarBazProto). Sie können dies mit der java_outer_classname File Option überschreiben und den Standardwert vor Edition 2024 von BarBaz oder BarBazOuterClass ersetzen, je nachdem, ob Konflikte bestehen.

Java: large_enum

Diese Funktion ermöglicht die Erstellung großer Java-Aufzählungen, die über das Aufzählungslimit hinausgehen, aufgrund von Standard-Konstantenbeschränkungen, die durch die Java-Sprache auferlegt werden.

Die Erstellung großer Aufzählungen ist standardmäßig nicht aktiviert, aber Sie können sie explizit mit dieser Funktion aktivieren. Beachten Sie, dass diese Funktion Aufzählungs-ähnliches Verhalten repliziert, aber einige bemerkenswerte Unterschiede aufweist (z. B. sind Switch-Anweisungen nicht unterstützt).

Grammatikänderungen

import option

Edition 2024 fügt Unterstützung für Optionsimporte mit der Syntax import option hinzu.

Im Gegensatz zu normalen import-Anweisungen importiert import option nur benutzerdefinierte Optionen, die in einer .proto-Datei definiert sind, ohne andere Symbole zu importieren.

Das bedeutet, dass Nachrichten und Aufzählungen vom Optionsimport ausgeschlossen sind. Im folgenden Beispiel kann die Bar-Nachricht nicht als Feldtyp in foo.proto verwendet werden, aber Optionen vom Typ Bar können immer noch gesetzt werden.

Optionsimporte müssen ebenfalls nach allen anderen Importanweisungen kommen.

Beispiel

// bar.proto
edition = "2024";

import "google/protobuf/descriptor.proto";

message Bar {
  bool bar = 1;
}

extend proto2.FileOptions {
  bool file_opt1 = 5000;
  Bar file_opt2 = 5001;
}
// foo.proto:
edition = "2024";

import option "bar.proto";

option (file_opt1) = true;
option (file_opt2) = {bar: true};

message Foo {
  // Bar bar = 1; // This is not allowed
}

Optionsimporte erfordern keine generierten Code für ihre Symbole und müssen daher in proto_library als option_deps und nicht als deps bereitgestellt werden. Dies vermeidet die Generierung von unerreichbarem Code.

proto_library(
  name = "foo",
  srcs = ["foo.proto"],
  option_deps = [":custom_option"]
)

Optionsimporte und option_deps werden dringend empfohlen, wenn Sie Protobuf-Sprachfunktionen und andere benutzerdefinierte Optionen importieren, um die Generierung von unnötigem Code zu vermeiden.

option_deps erfordert Bazel 8 oder höher, da das native.proto_library in Bazel 7 dies nicht unterstützt.

Dies ersetzt auch import weak, das in Edition 2024 entfernt wird.

export / local Schlüsselwörter

export und local Schlüsselwörter werden in Edition 2024 als Modifikatoren für die Symbol-Sichtbarkeit von importierbaren Symbolen hinzugefügt, im Gegensatz zum Standardverhalten, das durch die default_symbol_visibility Funktion vorgegeben wird.

Dies steuert, welche Symbole aus anderen Proto-Dateien importiert werden können, wirkt sich aber nicht auf die Codegenerierung aus.

In Edition 2024 können diese standardmäßig für alle Nachrichten- und Aufzählungssymbole gesetzt werden. Einige Werte der default_symbol_visibility Funktion schränken jedoch weiter ein, welche Symbole exportierbar sind.

Beispiel

// Top-level symbols are exported by default in Edition 2024
local message LocalMessage {
  // Nested symbols are local by default in Edition 2024
  export enum ExportedNestedEnum {
    UNKNOWN_EXPORTED_NESTED_ENUM_VALUE = 0;
  }
}

„import weak“ und weak Field Option

Schwache Importe sind ab Edition 2024 nicht mehr erlaubt.

Die meisten Benutzer, die zuvor import weak zur Deklaration einer "schwachen Abhängigkeit" für den Import benutzerdefinierter Optionen ohne generierten Code für C++ und Go verwendeten, sollten stattdessen auf import option umsteigen.

ctype Field Option

Die ctype Field Option ist ab Edition 2024 nicht mehr erlaubt. Verwenden Sie stattdessen die features.(pb.cpp).string_type Funktion.

java_multiple_files File Option

Die java_multiple_files File Option wird in Edition 2024 zugunsten der neuen features.nest_in_file_class Java-Funktion entfernt.