Maison >développement back-end >C++ >Comment puis-je sérialiser les champs privés et de sous-classe dans JSON.Net ?

Comment puis-je sérialiser les champs privés et de sous-classe dans JSON.Net ?

Barbara Streisand
Barbara Streisandoriginal
2025-01-07 20:25:39364parcourir

How Can I Serialize Private and Subclass Fields in JSON.Net?

JSON.Net : sérialisation des champs privés et hérités

Ce guide montre comment sérialiser des objets complexes à l'aide de JSON.Net, y compris les champs privés et ceux hérités des sous-classes. La sérialisation convertit les objets dans un format stockable ou transmissible. Pour les objets avec des membres privés ou un héritage complexe, JSON.Net nécessite une gestion personnalisée.

Le défi :

Vous disposez d'une hiérarchie de classes avec des champs d'accessibilité variable (public, privé, protégé, etc.). Vous devez sérialiser tous les champs, même les champs privés et ceux des sous-classes, par exemple pour la sauvegarde des données.

La solution :

Un résolveur de contrat personnalisé permet de remplacer le comportement de sérialisation par défaut de JSON.Net. Ce résolveur forcera l'inclusion de tous les champs, quels que soient leurs modificateurs d'accès.

Implémentation JSON.Net :

<code class="language-csharp">var settings = new JsonSerializerSettings { ContractResolver = new MyContractResolver() };
var json = JsonConvert.SerializeObject(myObject, settings);</code>

Résolveur de contrat personnalisé (MyContractResolver) :

<code class="language-csharp">public class MyContractResolver : Newtonsoft.Json.Serialization.DefaultContractResolver
{
    protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
    {
        var props = type.GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)
                        .Select(p => base.CreateProperty(p, memberSerialization))
                        .Union(type.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)
                                   .Select(f => base.CreateProperty(f, memberSerialization)))
                        .ToList();
        props.ForEach(p => { p.Writable = true; p.Readable = true; });
        return props;
    }
}</code>

Ce résolveur examine tous les champs d'instance et propriétés (publiques et privées) du type donné et ses classes de base. Il marque ensuite chaque propriété comme étant à la fois lisible et inscriptible, garantissant une sérialisation complète. Notez que l'utilisation de cette approche pour sérialiser les champs privés doit être effectuée avec prudence, en particulier pour les données sensibles en matière de sécurité.

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