Как настроить Json.NET для сериализации частных членов и НЕ сериализовать общедоступные свойства readonly (без использования атрибутов).
У меня была проблема с созданием пользовательского IContractResolver
, но я немного потерял.
Как настроить Json.NET для сериализации частных членов и НЕ сериализовать общедоступные свойства readonly (без использования атрибутов).
У меня была проблема с созданием пользовательского IContractResolver
, но я немного потерял.
Для частичного ответа 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.
В ответ на ответ Криса свойство 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);
}
}