Freigeben über


Migrieren zu System.Text.Json (JSON)

Die System.Text.Json-Bibliothek betont standardmäßig literales, deterministisches Verhalten und vermeidet Schätzwerte oder Interpretationen im Namen des Aufrufers. Die Bibliothek ist absichtlich auf diese Weise konzipiert, um für Leistung und Sicherheit zu sorgen. Obwohl System.Text.Json hochgradig konfigurierbar ist und seine Funktionen dazu verwendet werden können, Änderungen an serialisierten Typen zu minimieren, ist es wichtig, die Kompromisse zwischen der Verarbeitung vorhandener Typen mit möglichst wenigen Änderungen und der Umgestaltung von Typen zu berücksichtigen, um eine idiomatische und sichere serialization zu ermöglichen.

Bei der Migration von BinaryFormatter zu System.Text.Json ist es wichtig, die folgenden Verhaltensweisen und Optionen zu beachten:

  • Standardmäßig werden die Felder von System.Text.Json nicht serialisiert oder deserialisiert, sie können aber mit Anmerkungen hinsichtlich der serialization versehen werden. Alternativ können JsonSerializerOptions.IncludeFields vorsichtig auf true festgelegt werden, um alle öffentlichen Felder für die zu serialisierenden Typen einzuschließen.

    JsonSerializerOptions options = new()
    {
        IncludeFields = true
    };
    
  • Standardmäßig ignoriert System.Text.Json private Felder und Eigenschaften. Sie können die Verwendung eines nicht öffentlichen Accessors für eine Eigenschaft mithilfe des [JsonInclude]-Attributs aktivieren. Das Einschließen privater Felder erfordert einige komplexe zusätzliche Arbeit.

  • System.Text.Jsonkann schreibgeschützte Felder oder Eigenschaften nicht deserialisieren, aber Sie können das Attribut [JsonConstructor] verwenden, um anzugeben, dass der angegebene Konstruktor zum Erstellen von Instanzen des zu deserialisierenden Typs genutzt werden soll. Der Konstruktor kann die schreibgeschützten Felder und Eigenschaften festlegen.

  • Um das standardmäßige serialization-Verhalten für einen bestimmten Typ zu überschreiben, können Sie benutzerdefinierte Konverter schreiben.

  • Auf diese Weise wird die serialization und die Deserialisierung zahlreicher Auflistungen unterstützt, es gibt jedoch Einschränkungen. In der Dokumentation zu unterstützten Auflistungstypen finden Sie ausführliche Informationen dazu, welche Auflistungen für die serialization und die Deserialisierung unterstützt werden.

  • Unter bestimmten Bedingungen wird die serialization und die Deserialisierung von benutzerdefinierten generischen Auflistungen unterstützt.

  • Bei folgenden handelt es sich um weitere Typen ohne integrierte Unterstützung: DataSet, DataTable, DBNull, TimeZoneInfo, Type und ValueTuple. Sie können jedoch einen benutzerdefinierten Konverter schreiben, um diese Typen zu unterstützen.

  • Es wird die serialization und die Deserialisierung der polymorphen Typhierarchie unterstützt, bei der die Typen explizit mithilfe des Attributs [JsonDerivedType] oder des benutzerdefinierten Konverters aktiviert wurden. Offene Vererbungshierarchien werden nicht unterstützt, und das Roundtripping mit Polymorphismus erfordert Typendiskriminatorbezeichner für alle bekannten abgeleiteten Typen.

  • Das Attribut [JsonIgnore] einer Eigenschaft bewirkt, dass die Eigenschaft während der serialization im JSON-Code ausgelassen wird.

  • Um Verweise beizubehalten und Zirkelbezüge zu behandeln, legen Sie JsonSerializerOptions.ReferenceHandler in System.Text.Json auf ReferenceHandler.Preserve fest.

  • Serialization kann mit benutzerdefinierten Verträgen umfassend angepasst werden, wodurch viele Szenarios ermöglicht und Änderungen an serialisierten Typen minimiert werden.