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
Linda Hamiltonoriginal
2025-01-24 13:12:10266parcourir

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>
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>

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!

Déclaration:
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