[c#] JSON.Net: Forcer la sérialisation de tous les champs privés et de tous les champs des sous-classes



Answers

@ La réponse de LB est géniale. Mais ... cela nécessite .NET 3.5 ou supérieur.

Pour ceux d'entre nous coincés avec 2.0 ...

public class ForceJSONSerializePrivatesResolver : Newtonsoft.Json.Serialization.DefaultContractResolver
{
    protected override IList<Newtonsoft.Json.Serialization.JsonProperty> CreateProperties(System.Type type, MemberSerialization memberSerialization)
    {
        var props = type.GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);

        List<Newtonsoft.Json.Serialization.JsonProperty> jsonProps = new List<Newtonsoft.Json.Serialization.JsonProperty>();

        foreach( var prop in props )
        {
        jsonProps.Add( base.CreateProperty(prop, memberSerialization));
        }

        foreach( var field in type.GetFields(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance) )
        {
        jsonProps.Add ( base.CreateProperty( field, memberSerialization ) );
        }

        jsonProps.ForEach(p => { p.Writable = true; p.Readable = true; });
        return jsonProps;
    }
}

... semble fonctionner.

Question

J'ai une classe avec plusieurs classes différentes et j'envoie l'information dans ces classes aux clients mais je ne veux pas les envoyer tous si certains sont privés, certains ont le [JsonObject(MemberSerialization.OptIn)] etc.

Cependant, maintenant je veux faire une sauvegarde de tous ces objets quand j'ai besoin d'arrêter le serveur et toutes les 12 heures (je ne veux pas utiliser une base de données) donc ce que je veux faire (si possible) est de forcer le JSON .Net Serializer pour convertir l'objet et tous les objets appartenant à cet objet.

Par exemple:

class Foo
{
 public int Number;
 private string name;
 private PrivateObject po = new PrivateObject();

 public string ToJSON()
 { /* Serialize my public field, my property and the object PrivateObject */ }

}

J'ai essayé ce code (même s'il est obsolète) mais il ne sérialise pas les objets liés à mon objet:

 Newtonsoft.Json.JsonSerializerSettings jss = new Newtonsoft.Json.JsonSerializerSettings();

        Newtonsoft.Json.Serialization.DefaultContractResolver dcr = new Newtonsoft.Json.Serialization.DefaultContractResolver();
        dcr.DefaultMembersSearchFlags |= System.Reflection.BindingFlags.NonPublic;
        jss.ContractResolver = dcr;



        return Newtonsoft.Json.JsonConvert.SerializeObject(this, jss);



Links



Tags

c# c#   json.net