
Remplacement de la sérialisation par défaut dans JsonConverter personnalisé
Question
Comment conserver le comportement de sérialisation par défaut dans un System.Text.Json.JsonConverter personnalisé sans logique d'écriture personnalisée ?
Description
Les choix de JsonConverter ont des priorités différentes, notamment :
- Fonctionnalités au niveau de l'attribut
- Convertisseurs ajoutés à la collection Convertisseurs
- Attributs qui s'appliquent aux types de valeurs personnalisés ou aux POCO
- Le convertisseur renvoyé par l'usine du convertisseur
Solution
Il existe différentes manières d'implémenter la sérialisation par défaut en fonction de la manière dont le convertisseur est appliqué :
Fonctionnalités au niveau de l'attribut
Appelez JsonSerializer.Serialize(writer, person, options); générera la sérialisation par défaut.
Convertisseurs dans la collection Convertisseurs
- Copie les options transmises, en supprimant le convertisseur de la liste des convertisseurs de la copie.
- Transmettre les options modifiées à JsonSerializer.Serialize(Utf8JsonWriter, T, JsonSerializerOptions);
-
Remarque : Cette méthode peut ne pas être thread-safe et peut causer des problèmes avec les types récursifs.
Type de valeur personnalisé ou POCO
- Actuellement, la génération d'une sérialisation par défaut pour les convertisseurs appliqués aux types de valeurs personnalisés ou aux POCO n'est pas prise en charge.
Usine de convertisseurs
- Utilisez DefaultConverterFactory pour créer un convertisseur qui génère une sérialisation par défaut.
- Cache les options modifiées dans les convertisseurs fabriqués qui ne contiennent pas de convertisseurs.
Exemple
Voici un exemple utilisant une usine de conversion :
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);
Copier après la connexion
Remarque importante
- L'application de DefaultConverterFactory directement à un type de valeur personnalisé ou à POCO entraînera un débordement de pile.
- L'utilisation de JsonSerializer.Serialize(writer, person, options); entraînera une sérialisation par défaut lors de l'application d'un convertisseur aux propriétés au niveau de la propriété.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!