JSON.Net: принудительная сериализация всех частных полей и всех полей в подclassах

У меня есть class с несколькими разными classами, и я отправляю информацию в этих classах клиентам, но я не хочу отправлять их всем, поэтому некоторые из них являются частными, некоторые имеют [JsonObject(MemberSerialization.OptIn)] и т. Д.

Тем не менее, теперь я хочу сделать резервную копию всех этих объектов, когда мне нужно выключить сервер и каждые 12 часов (я не хочу использовать базу данных), поэтому то, что я хочу сделать (если это возможно), – заставить JSON .Net Serializer для преобразования объекта и всего объекта, принадлежащего этому объекту.

Например:

 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 */ } } 

Я пробовал этот код (хотя он устарел), но он не сериализует объекты, связанные с моим объектом:

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

Это должно работать:

 var settings = new JsonSerializerSettings() { ContractResolver = new MyContractResolver() }; var json = JsonConvert.SerializeObject(obj, settings); 

 public class MyContractResolver : Newtonsoft.Json.Serialization.DefaultContractResolver { protected override IList 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; } } 

@ Ответ LB велик. Но … это требует .NET 3.5 или выше.

Для тех из нас, кто придерживался 2.0 …

 public class ForceJSONSerializePrivatesResolver : Newtonsoft.Json.Serialization.DefaultContractResolver { protected override IList CreateProperties(System.Type type, MemberSerialization memberSerialization) { var props = type.GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); List jsonProps = new List(); 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; } } 

… кажется, работает.

Awesome thanks @LB Вот полная реализация в сценарии .linq, если кто-то хочет протестировать с частными подclassами – например, See A имеет частный подclass B.

 void Main() { var a = A.Test(); SerialiseAllFields.Dump(a); } class A { private int PrivField1; private int PrivProp1 { get; set; } private B PrivSubClassField1; public static A Test() { return new A { PrivField1 = 1, PrivProp1 = 2, PrivSubClassField1 = B.Test() }; } } class B { private int PrivField1; private int PrivProp1 { get; set; } public static B Test() { return new B { PrivField1 = 3, PrivProp1 = 4 }; } } // Define other methods and classes here public static class SerialiseAllFields { public static void Dump(object o, bool indented = true) { var settings = new Newtonsoft.Json.JsonSerializerSettings() { ContractResolver = new AllFieldsContractResolver() }; if (indented) { settings.Formatting = Newtonsoft.Json.Formatting.Indented; } Newtonsoft.Json.JsonConvert.SerializeObject(o, settings).Dump(); } } public class AllFieldsContractResolver : Newtonsoft.Json.Serialization.DefaultContractResolver { protected override IList CreateProperties(Type type, Newtonsoft.Json.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; } } 

Интересно, что поля поддержки для свойств также сериализованы, то есть вывод:

 { "PrivProp1": 2, "PrivField1": 1, "k__BackingField": 2, "PrivSubClassField1": { "PrivProp1": 4, "PrivField1": 3, "k__BackingField": 4 } } 
  • Невозможно десериализовать текущий объект JSON (например, {"name": "value"}) в тип 'System.Collections.Generic.List`1
  • Создание десериализации свойств, но не сериализация с помощью json.net
  • JSON.NET и nHibernate Lazy Загрузка коллекций
  • Серийный объект Json.NET с корневым именем
  • C # JSON.NET - десериализация ответа, использующего необычную структуру данных
  • Исключить свойство из сериализации через пользовательский атрибут (json.net)
  • JSON.Net Обнаружен собственный цикл привязки
  • Объединение двух массивов Json.NET путем конкатенации содержащихся элементов
  • Как десериализовать объект JSON с недопустимым именем поля в нем
  • Может ли Json.NET сериализовать / десериализовать в / из streamа?
  • JSON.Net выдает StackOverflowException при использовании
  • Interesting Posts

    Предотrotation автоматического popToRootViewController при двойном касании UITabBarController

    Где Visual Studio ищет файлы заголовков C ++?

    Получить путь изображения от ACTION_IMAGE_CAPTURE Intent

    jQuery и TinyMCE: значение textarea не отправляет

    Отключить предупреждение безопасности для сайтов Intranet

    Как настроить Alertbox из BroadcastReceiver

    Масштабировать пользовательский интерфейс для нескольких разрешений / различных устройств

    Как запустить Firefox в тюрьму без серьезной потери производительности?

    Может ли размер указателей варьироваться между данными и указателями функций?

    Эффективность анализа (если, TryParse, Try-Catch)

    Ошибка компиляции: отклонение ‘\ 302’ в программе и т. Д.

    GVim не является источником .bashrc, .bash_profile или .profile из неинтерактивной оболочки без входа

    Контроллер панели вкладок внутри controllerа навигации или общий доступ к корневой панели навигации

    Может ли кто-нибудь привести пример сходства косинусов, очень простым, графическим способом?

    Общие настройки Android

    Давайте будем гением компьютера.