Подтвердить что ты не робот

Json.NET Сериализовать приватные члены, а не только свойства readonly

Как настроить Json.NET для сериализации частных членов и НЕ сериализовать общедоступные свойства readonly (без использования атрибутов).

У меня была проблема с созданием пользовательского IContractResolver, но я немного потерял.

4b9b3361

Ответ 1

Для частичного ответа messing с DefaultContractResolver.DefaultMembersSearchFlags может заставить его включать личные вещи:

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

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

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

Кажется, что нужно работать с большим количеством объектов, хотя некоторые из них, похоже, генерируют исключение CLR.

Ответ 2

В ответ на ответ Криса свойство DefaultMemberSearchFlags на DefaultContractResolver было устарел с версии 6. Несмотря на то, что сообщение об устаревании говорит, я считаю, что вам нужно будет перезаписать метод CreateProperties, также как L.B объясняет.

Этот метод дает вам полный контроль, включая исключение свойств readonly:

class PrivateContractResolver : DefaultContractResolver
{
    protected override List<MemberInfo> GetSerializableMembers(Type objectType)
    {
        var flags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic;
        MemberInfo[] fields = objectType.GetFields(flags);
        return fields
            .Concat(objectType.GetProperties(flags).Where(propInfo => propInfo.CanWrite))
            .ToList();
    }

    protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
    {
           return base.CreateProperties(type, MemberSerialization.Fields);
    }           
}