Maison > développement back-end > C++ > Comment puis-je réaliser la sérialisation personnalisée des objets enfants polymorphes dans json.net sans le champ '$ type'?

Comment puis-je réaliser la sérialisation personnalisée des objets enfants polymorphes dans json.net sans le champ '$ type'?

Linda Hamilton
Libérer: 2025-01-24 13:12:10
original
235 Les gens l'ont consulté

How Can I Achieve Custom Serialization of Polymorphic Child Objects in Json.Net Without the

json.net Les objets multi-états personnalisés sérialisent, aucun champ de type supplémentaire

Question:

Le paramètre

/ inverse-séquentilation du réglage / dérivé / dérivé du JSON.net est très pratique. Cependant, cette méthode introduira des champs

supplémentaires dans le JSON sérialisé, augmentant les frais généraux. TypeNameHandling.Auto $type Solution:

Classe de base personnalisée avec des attributs de type de codage:

Au lieu des informations sous-type stockées dans la classe des conteneurs, il est préférable de l'ajouter en tant qu'attribut à la classe de base:

Cet attribut reflète le type de l'objet de l'objet et le code en valeur d'énumération.

Le dictionnaire doit être implémenté par lui-même pour cartographier le type de valeur énumérée.

<code class="language-csharp">[JsonConverter(typeof(SubTypeClassConverter))]
public class SubTypeClassBase
{
    [JsonConverter(typeof(StringEnumConverter))]
    public SubType Type { get { return typeToSubType[GetType()]; } }
}</code>
Copier après la connexion
JSONConverter est utilisé pour approfondir:

typeToSubType

Créez une personnalité

:

La méthode doit être implémentée par elle-même et renvoie le type correspondant en fonction de la valeur d'énumération.

JsonConverter Avantages:

<code class="language-csharp">public class SubTypeClassConverter : JsonConverter
{
    // 读取 JSON 并确定实际类型
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        var token = JToken.Load(reader);
        var typeToken = token["Type"];
        var actualType = SubTypeClassBase.GetTypeFromSubType(typeToken.ToObject<SubType>(serializer)); // 使用 GetTypeFromSubType 方法
        if (existingValue == null || existingValue.GetType() != actualType)
        {
            // 创建实际的对象实例
            var contract = serializer.ContractResolver.ResolveContract(actualType);
            existingValue = contract.DefaultCreator();
        }
        // 使用 "Populate" 方法避免无限递归
        using (var subReader = token.CreateReader())
        {
            serializer.Populate(subReader, existingValue);
        }
        return existingValue;
    }

    // ...其他方法 (WriteJson 等) ...
}</code>
Copier après la connexion

GetTypeFromSubType Encodage d'informations sous-type dans les attributs de la classe, indépendamment du conteneur.

La circularisation est traitée dynamiquement, permettant à la structure de la classe de modifier la structure de la classe à l'avenir sans endommager la sérialisation. Il élimine le champ

redondant dans la sortie JSON et réduit sa taille.
  • Remarque:
  • l'implémentation spécifique de
  • et
  • dans le fragment de code et de l'implémentation de la méthode $type. L'énumération
  • doit inclure tous les sous-types possibles.
Le dictionnaire doit cartographier le type de chaque sous-classe à la valeur d'énumération

correspondante. Les méthodes doivent effectuer un mappage inverse.

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal