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!