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:
<code class="language-csharp">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);</code>
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!
Stellungnahme:Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn