
Standardserialisierungsüberschreibung im benutzerdefinierten JsonConverter
Frage
Wie kann das standardmäßige Serialisierungsverhalten in einem benutzerdefinierten System.Text.Json.JsonConverter ohne benutzerdefinierte Schreiblogik beibehalten werden?
Beschreibung
JsonConverter-Auswahlmöglichkeiten haben unterschiedliche Prioritäten, darunter:
- Funktionen auf Attributebene
- Konverter zur Konverter-Sammlung hinzugefügt
- Attribute, die für benutzerdefinierte Werttypen oder POCOs gelten
- Der von der Konverterfabrik zurückgegebene Konverter
Lösung
Je nachdem, wie der Konverter angewendet wird, gibt es verschiedene Möglichkeiten, die Standardserialisierung zu implementieren:
Funktionen auf Attributebene
Rufen Sie JsonSerializer.Serialize(writer, person, options) auf, um eine Standardserialisierung zu generieren.
Konverter in der Konverter-Sammlung
- Kopiert die übergebenen Optionen und entfernt den Konverter aus der Konverterliste der Kopie.
- Geänderte Optionen an JsonSerializer.Serialize übergeben(Utf8JsonWriter, T, JsonSerializerOptions);
-
Hinweis: Diese Methode ist möglicherweise nicht threadsicher und kann Probleme mit rekursiven Typen verursachen.
Benutzerdefinierter Werttyp oder POCO
- Derzeit wird die Generierung der Standardserialisierung für Konverter, die auf benutzerdefinierte Werttypen oder POCOs angewendet werden, nicht unterstützt.
Konverterfabrik
- Verwenden Sie DefaultConverterFactory, um einen Konverter zu erstellen, der die Standardserialisierung generiert.
- Geänderte Optionen in hergestellten Konvertern zwischenspeichern, die keine Konverter enthalten.
Beispiel
Hier ist ein Beispiel mit einer Konverterfabrik:
public sealed class PersonConverter : DefaultConverterFactory<Person>
{
...
protected override T Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions modifiedOptions)
=> (T)JsonSerializer.Deserialize(ref reader, typeToConvert, modifiedOptions);
protected override void Write(Utf8JsonWriter writer, T value, JsonSerializerOptions modifiedOptions)
=> JsonSerializer.Serialize(writer, value, modifiedOptions);
}
...
var person = new Person("John", "Doe");
var options = new JsonSerializerOptions { Converters = { new PersonConverter() } };
var json = JsonSerializer.Serialize(person, options);
Nach dem Login kopieren
Wichtiger Hinweis
- Das direkte Anwenden von DefaultConverterFactory auf einen benutzerdefinierten Werttyp oder POCO führt zu einem Stapelüberlauf.
- Die Verwendung von JsonSerializer.Serialize(writer, person, options); führt zu einer Standardserialisierung, wenn ein Konverter auf Eigenschaften auf Eigenschaftsebene angewendet wird.
Das obige ist der detaillierte Inhalt vonWie kann ich das standardmäßige JSON-Serialisierungsverhalten in benutzerdefinierten JsonConvertern beibehalten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!