Teilen ü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. Während System.Text.Json hochgradig konfigurierbar ist und seine Features verwendet werden können, um Änderungen zu minimieren, die für serialisierte Typen erforderlich sind, ist es wichtig, die Kompromisse zwischen der Behandlung vorhandener Typen mit so wenigen Änderungen wie möglich und umgestalten von Typen zu berücksichtigen, um die idiomatische und sichere Serialisierung 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 Serialisierung 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.Json kann 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 Standard-Serialisierungsverhalten für einen bestimmten Typ zu überschreiben, können Sie benutzerdefinierte Konverter schreiben.

  • Sie unterstützt die Serialisierung und Deserialisierung vieler Sammlungen, es gibt jedoch Einschränkungen. In der Dokumentation zu unterstützten Typen finden Sie ausführliche Informationen dazu, welche Typen und Auflistungen für die Serialisierung und die Deserialisierung unterstützt werden.

  • Unter bestimmten Bedingungenunterstützt das System die Serialisierung und Deserialisierung von benutzerdefinierten generischen Sammlungen.

  • 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 Serialisierung und Deserialisierung der polymorphen Typhierarchie unterstütz, 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 [JsonIgnore]-Attribut für eine Eigenschaft bewirkt, dass die Eigenschaft während der Serialisierung aus dem JSON-Code weggelassen wird.

  • Um Verweise beizubehalten und Zirkelbezüge zu behandeln, legen Sie System.Text.Json in JsonSerializerOptions.ReferenceHandler 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.