News-Ankündigungen für Version 30.x
Die folgenden Ankündigungen sind spezifisch für Version 30.x, die am 4. März 2025 veröffentlicht wurde. Informationen, die chronologisch dargestellt sind, finden Sie unter News.
Die folgenden Abschnitte behandeln geplante brechende Änderungen in der v30-Version, die für 2025 Q1 erwartet wird. Ebenfalls enthalten sind einige Änderungen, die nicht brechend sind, aber möglicherweise Maßnahmen Ihrerseits erfordern. Diese beschreiben Änderungen, wie sie voraussichtlich implementiert werden, aber aufgrund der flexiblen Natur von Software werden einige dieser Änderungen möglicherweise nicht umgesetzt oder können von der Beschreibung in diesem Thema abweichen.
Änderungen in C++
C++ wird seine Hauptversion von 5.29.x auf 6.30.x anheben.
Descriptor APIs
v30 wird Rückgabetypen in Deskriptoren (wie full_name) auf absl::string_view aktualisieren. Dies ermöglicht Speicherersparnisse in Deskriptoren.
v28 hat das Makro PROTOBUF_FUTURE_STRING_VIEW_RETURN_TYPE eingeführt, das Sie in der Zwischenzeit verwenden können, um den aktualisierten Rückgabetyp vor der brechenden Veröffentlichung zu aktivieren. Die v30-Veröffentlichung wird den Standardwert ändern und das Makro entfernen.
ctype aus FieldDescriptor-Optionen entfernt
v30 wird die ctype aus den FieldDescriptor-Optionen nicht mehr verfügbar machen. Sie können stattdessen die API FieldDescriptor::cpp_string_type() verwenden, die in der v28-Veröffentlichung hinzugefügt wurde.
CMake-Submodule durch abgerufene Abhängigkeiten ersetzen
v30 wird Submodule entfernen und zum alten CMake-Muster von upb übergehen, Abhängigkeiten abzurufen.
Wenn Sie installierte Pakete verwenden, sind Sie nicht betroffen. Es könnte einige CMake-Workflows beeinträchtigen.
Debug-APIs ändern, um sensible Felder zu schwärzen
Wir planen, die Protobuf-Debug-APIs (einschließlich Protobuf AbslStringify, proto2::ShortFormat, proto2::Utf8Format, Message::DebugString, Message::ShortDebugString, Message::Utf8DebugString) in v30 zu ändern, um sensible Felder zu schwärzen, die mit debug_redact annotiert sind; die Ausgaben dieser APIs enthalten ein prozessspezifisches, zufälliges Präfix und sind daher nicht mehr mit Protobuf TextFormat Parsers parsierbar.
Lesen Sie mehr darüber im Nachrichtenartikel vom 21. November 2024.
Entfernen einer reflektionsbezogenen Funktion
Wir entfernen die folgende reflektionsbezogene Funktion: MutableRepeatedFieldRef<T>::Reserve().
Eine bevorstehende Leistungsverbesserung in RepeatedPtrField ist mit dieser API inkompatibel. Die Verbesserung soll den wiederholten Zugriff auf die Elemente von RepeatedPtrField beschleunigen, insbesondere den sequenziellen Zugriff.
Veraltete APIs entfernt
v30 wird die folgenden öffentlichen Laufzeit-APIs entfernen, die seit mindestens einer Minor- oder Major-Version als veraltet gekennzeichnet sind und veraltet oder ersetzt sind.
Arena::CreateMessage
API: Arena::CreateMessage
Ersatz: Arena::Create
Arena::GetArena
API: Arena::GetArena
Ersatz: value->GetArena()
RepeatedPtrField::ClearedCount
API: RepeatedPtrField::ClearedCount
Ersatz: Migration zu Arenen (Migrationsleitfaden).
JsonOptions
API: JsonOptions
Ersatz: JsonPrintOptions
Unterstützung für C++14 einstellen
Diese Veröffentlichung wird C++ 14 als minimale unterstützte Version einstellen und auf 17 anheben, gemäß der Foundational C++ Support-Matrix.
Gemäß unserer Richtlinien betrachten wir dies nicht als brechende Änderung.
ASAN-Vergiftung nach dem Leeren von Oneof-Nachrichten auf Arena einführen
Diese Änderung fügt eine Härtungsprüfung hinzu, die C++-Protobufs mit Arenen betrifft. Oneof-Nachrichten, die auf der Protobuf-Arena alloziert werden, werden nun im Debug-Modus geleert und im ASAN-Modus vergiftet. Nach dem Leeren stürzt ein zukünftiger Versuch, den Speicherbereich zu verwenden, in ASAN als Use-After-Free-Fehler ab.
Diese Implementierung erfordert C++17.
Unser C++ CocoaPods-Release einstellen
In v30 werden wir unser C++ CocoaPods-Release einstellen, das seit v4.x.x fehlerhaft ist. C++-Benutzer sollten stattdessen direkt unser GitHub-Release verwenden.
Änderungen in JRuby
v30 wird die Standardimplementierung für JRuby auf FFI umstellen, was für einige JRuby-Benutzer brechend sein kann.
Beachten Sie, dass diese Änderung keine Ruby-Major-Versionserhöhung bewirkt, da JRuby nicht offiziell unterstützt wird.
Änderungen in Python
Python wird seine Hauptversion von 5.29.x auf 6.30.x anheben.
Unterstützung für Python 3.8 einstellen
Gemäß unserer offiziellen Python-Supportrichtlinie werden wir die Unterstützung für Python 3.8 und niedriger einstellen. Das bedeutet, dass die minimale unterstützte Python-Version 3.9 ist.
Alias bazel/system_python.bzl entfernen
v30 wird den Legacy-Alias bazel/system_python.bzl entfernen.
Entfernen Sie direkte Verweise auf system_python.bzl zugunsten der Verwendung von protobuf_deps.bzl. Verwenden Sie python/dist/system_python.bzl, wohin es in v5.27.0 verschoben wurde, wenn Sie einen direkten Verweis benötigen.
Änderungen bei der Validierung von Feldsettern
Die Feld-Setter von Python und upb werden in v30 korrigiert, um geschlossene Enums unter Edition 2023 zu validieren. Geschlossene Enum-Felder, die mit ungültigen Werten aktualisiert werden, generieren Fehler.
Veralteten py_proto_library Makro entfernen
Das veraltete interne Bazel-Makro py_proto_library in protobuf.bzl wird in v30.x entfernt.
Dies sollte durch das offizielle py_proto_library ersetzt werden, das ab v29.x nach Protocol Buffers in bazel/py_proto_library verschoben wird. Diese Implementierung war zuvor in rules_python vor v29.x verfügbar.
Veraltete APIs entfernt
v30 wird die folgenden öffentlichen Laufzeit-APIs entfernen, die seit mindestens einer Minor- oder Major-Version als veraltet gekennzeichnet sind und veraltet oder ersetzt sind.
Reflection-Methoden
APIs: reflection.ParseMessage, reflection.MakeClass
Ersatz: message_factory.GetMessageClass()
RPC-Dienstschnittstellen
APIs: service.RpcException, service.Service, service.RpcController und service.RpcChannel
Ersatz: Ab Version 2.3.0 sollten RPC-Implementierungen nicht versuchen, darauf aufzubauen, sondern stattdessen Code-Generator-Plugins bereitstellen, die Code für die jeweilige RPC-Implementierung generieren.
MessageFactory- und SymbolDatabase-Methoden
APIs: MessageFactory.GetPrototype, MessageFactory.CreatePrototype, MessageFactory.GetMessages, SymbolDatabase.GetPrototype, SymbolDatabase.CreatePrototype und SymbolDatabase.GetMessages
Ersatz: message_factory.GetMessageClass() und message_factory.GetMessageClassesForFiles().
GetDebugString
APIs: GetDebugString
Ersatz
Kein Ersatz. Nur in Python C++, das nicht mehr veröffentlicht wird. Es wird in reinem Python oder UPB nicht unterstützt.
Änderung des setdefault-Verhaltens in Python für Map-Felder
Ab v30 wird setdefault für ScalarMap ähnlich wie für dict sein, mit der Ausnahme, dass sowohl Schlüssel als auch Wert gesetzt werden müssen. setdefault wird für MessageMaps abgelehnt.
Python verschachtelte Nachrichtenklasse __qualname__ enthält den Namen der äußeren Nachricht
Die verschachtelte Nachrichtenklasse __qualname__ von Python enthält jetzt den Namen der äußeren Nachricht. Vor v30 hatte __qualname__ dasselbe Ergebnis wie __name__ für verschachtelte Nachrichten, da der Name der äußeren Nachricht nicht enthalten war.
Zum Beispiel
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
Änderungen in Objective-C
Dies wird die erste brechende Veröffentlichung für Objective-C sein.
Objective-C wird seine Hauptversion von 3.x.x auf 4.30.x anheben.
Überarbeitung der APIs zur Behandlung unbekannter Felder, die die meisten vorhandenen APIs als veraltet kennzeichnen
v30 wird GPBUnknownFieldSet als veraltet kennzeichnen und durch GPBUnknownFields ersetzen. Der neue Typ behält die Reihenfolge der unbekannten Felder aus der ursprünglichen Eingabe oder den API-Aufrufen bei, um sicherzustellen, dass jede semantische Bedeutung der Reihenfolge erhalten bleibt, wenn eine Nachricht zurückgeschrieben wird.
Als Teil davon werden auch die APIs des Typs GPBUnknownField geändert, wobei fast alle vorhandenen APIs als veraltet gekennzeichnet und neue hinzugefügt werden.
Veraltete Property-APIs
varintListfixed32Listfixed64ListlengthDelimitedListgroupList
Veraltete Modifizierungs-APIs
addVarintaddFixed32addFixed64addLengthDelimitedaddGroup
Veralteter Initialisierer initWithNumber:.
Neue Property-APIs
typevarintfixed32fixed64lengthDelimitedgroup
Dieser Typ wird ein einzelnes Feldnummer in seinem Wert modellieren, anstatt *alle* Werte für eine gegebene Feldnummer zu *gruppieren*. Die APIs zum Erstellen neuer Felder sind die add*-APIs der Klasse GPBUnknownFields.
v30 wird auch -[GPBMessage unknownFields] als veraltet kennzeichnen. An seine Stelle treten neue APIs zum Extrahieren und Aktualisieren der unbekannten Felder der Nachricht.
Veraltete APIs entfernt
v30 wird die folgenden öffentlichen Laufzeit-APIs entfernen, die seit mindestens einer Minor- oder Major-Version als veraltet gekennzeichnet sind und veraltet oder ersetzt sind.
GPBFileDescriptor
API: -[GPBFileDescriptor syntax]
Ersatz: Obsolet.
GPBMessage mergeFrom:extensionRegistry
API: -[GPBMessage mergeFrom:extensionRegistry:]
Ersatz: -[GPBMessage mergeFrom:extensionRegistry:error:]
GPBDuration timeIntervalSince1970
API: -[GPBDuration timeIntervalSince1970]
Ersatz: -[GPBDuration timeInterval]
GPBTextFormatForUnknownFieldSet
API: GPBTextFormatForUnknownFieldSet()
Ersatz: Obsolet - Verwenden Sie GPBTextFormatForMessage(), das alle unbekannten Felder enthält.
GPBUnknownFieldSet
API: GPBUnknownFieldSet
Ersatz: GPBUnknownFields
GPBMessage unknownFields
API: GPBMessage unknownFields Property
Ersatz: -[GPBUnknownFields initFromMessage:], -[GPBMessage mergeUnknownFields:extensionRegistry:error:] und -[GPBMessage clearUnknownFields]
Veraltete Laufzeit-APIs für alten Gencode entfernen
Diese Veröffentlichung entfernt veraltete Laufzeitmethoden, die den Objective-C-Gencode von vor dem Release 3.22.x unterstützen. Die Bibliothek wird zur Laufzeit auch eine Protokollnachricht ausgeben, wenn alter generierter Code gestartet wird.
API: +[GPBFileDescriptor allocDescriptorForClass:file:fields:fieldCount:storageSize:flags:]
Ersatz: Mit einer aktuellen Version der Bibliothek neu generieren.
API: +[GPBFileDescriptor allocDescriptorForClass:rootClass:file:fields:fieldCount:storageSize:flags:]
Ersatz: Mit einer aktuellen Version der Bibliothek neu generieren.
API: +[GPBEnumDescriptor allocDescriptorForName:valueNames:values:count:enumVerifier:]
Ersatz: Mit einer aktuellen Version der Bibliothek neu generieren.
Ersatz: Mit einer aktuellen Version der Bibliothek neu generieren.
API: -[GPBExtensionDescriptor initWithExtensionDescription:]
Ersatz: Mit einer aktuellen Version der Bibliothek neu generieren.
Weitere Änderungen
Poison MSVC + Bazel
Wir werden die Unterstützung für die gemeinsame Nutzung von Bazel und MSVC in v34 einstellen. Ab v30 werden wir diese Kombination mit einem Fehler versehen, es sei denn, Sie geben das Opt-out-Flag --define=protobuf_allow_msvc=true an, um ihn zu unterdrücken.
Die Pfadlängenbeschränkungen von MSVC in Kombination mit dem Sandboxing von Bazel sind in Kombination immer schwieriger zu unterstützen. Anstatt Benutzer, die protobuf in einen langen Pfad installieren, zufällig zu beeinträchtigen, werden wir die Verwendung von MSVC aus Bazel vollständig verbieten. Wir werden MSVC weiterhin mit CMake unterstützen und beginnen, clang-cl mit Bazel zu unterstützen. Für Feedback oder Diskussionen siehe https://github.com/protocolbuffers/protobuf/issues/20085.
Weitere Änderungen (nicht brechend)
Zusätzlich zu diesen brechenden Änderungen gibt es einige weitere bemerkenswerte Änderungen. Obwohl die folgenden Änderungen nicht als brechend gelten, können sie dennoch Auswirkungen auf Benutzer haben.
Poison-Pill-Warnungen
v30 wird Poison Pills aktualisieren, um Warnungen für alte Gencode- + neue Laufzeitkombinationen auszugeben, die unter der neuen Rolling-Upgrade-Richtlinie funktionieren, aber beim *nächsten* Hauptupdate brechen werden. Zum Beispiel sollte Java 4.x.x Gencode gegen Laufzeit 5.x.x funktionieren, aber eine Warnung vor bevorstehenden Brüchen gegen Laufzeit 6.x.x ausgeben.
Änderungen an der UTF-8-Erzwingung in C# und Ruby
v30 enthält eine Korrektur, um die UTF-8-Erzwingung sprachübergreifend konsistent zu machen. Benutzer mit fehlerhaften Nicht-UTF-8-Daten in String-Feldern sehen möglicherweise früher UTF-8-Erzwingungsfehler.
Ruby- und PHP-Fehler bei der JSON-Analyse
v30 behebt Inkonformitäten beim JSON-Parsing von Strings in numerischen Feldern gemäß der JSON-Spezifikation.
Diese Korrektur wird nicht von einer Hauptversionserhöhung begleitet, aber Ruby und PHP werden nun Fehler für nicht-numerische Strings (z. B. "", "12abc", "abc") in numerischen Feldern ausgeben. v29.x wird eine Warnung für diese Fehlerfälle enthalten.