Maison >développement back-end >C++ >Comment puis-je sérialiser des champs privés et des objets profondément imbriqués dans JSON.Net ?
Utilisez ContractResolver personnalisé pour résoudre le problème des champs privés et des sous-classes dans la sérialisation JSON
Lors d'une sauvegarde régulière ou d'un débogage temporaire, vous devez sérialiser les champs privés et les champs profondément imbriqués dans la classe. Dans ce cas, vous pouvez utiliser le ContractResolver personnalisé de JSON.Net.
En implémentant un ContractResolver personnalisé, vous pouvez contrôler le processus de sérialisation et gérer de manière flexible les champs publics et privés. La clé est de remplacer la méthode CreateProperties dans la classe ContractResolver.
Modifiez cette méthode pour utiliser BindingFlags pour collecter les propriétés et les champs, en analysant tous les niveaux de visibilité : public, non public et niveau instance. Cette approche globale garantit que tous les domaines pertinents sont capturés.
N'oubliez pas de déverrouiller l'accès en lecture et en écriture pour chaque propriété après l'avoir définie. Vous pouvez accorder l'accès à ces propriétés pendant la sérialisation en remplaçant leur propriété Visibility.
Ce qui suit est un exemple de ContractResolver personnalisé :
<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>
En pratique, instanciez un ContractResolver personnalisé et transmettez-le au sérialiseur JSON.Net comme ceci :
<code class="language-csharp">var settings = new JsonSerializerSettings() { ContractResolver = new MyContractResolver() }; var json = JsonConvert.SerializeObject(obj, settings);</code>
Cette approche force effectivement JSON.Net à sérialiser les champs privés et les objets profondément imbriqués, fournissant ainsi une sauvegarde complète du graphe d'objets.
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!