JSON.NET -исключить свойства определенного типа во время выполнения

Мне интересно Как исключить / удалить определенные свойства данного типа (типов) (или их коллекций) из сериализации С использованием библиотеки Json.NET ? Я попытался написать свой собственный решатель контрактов (наследуя от DefaultContractResolver) не повезло.

Я знаю, что я мог бы сделать с помощью DataAnnotations, украшая исключенные свойства с ScriptIgnoreAttribute, а это не применимо по моему сценарию. Этот сериализованные объекты могут быть практически любыми, поэтому я не знаю, какие свойства исключить во время разработки. Я знаю только типы свойств, которые не должны быть сериализованы.

Это выглядит довольно простой задачей, но, к сожалению, я нигде не смог найти достойного решения...

кстати Я не обязан Json.NET библиотека - если это можно легко сделать с помощью сериализаторов по умолчанию/других .NET JSON, это было бы одинаково хорошим решением для мне.

обновление

свойства должны быть исключены перед попыткой их сериализации. почему?

в принципе, типы объектов, которые я получаю и сериализую, могут иметь динамические свойства типа, наследуемого от IDynamicMetaObjectProvider. Я не собираюсь описывать все детали, но DynamicMetaObject вернулся из GetMetaObject метод этих объектов не имеет DynamicMetaObject.GetDynamicMemberNames реализован метод (throws NotImplementedException...). суммирование-проблема в том, что эти объекты (мне нужно исключить) не позволяют перечислять их свойства, что Json.NET сериализатор пытается делать за кулисами. Я всегда заканчиваю с NotImplementedException быть брошенным.

3 ответов


Я пробовал как сериализацию WCF JSON, так и


создайте свой собственный распознаватель контрактов, переопределите метод, который создает свойства для объекта, а затем отфильтруйте результаты, чтобы включить только те, которые вы хотите.


вы рассматривали возможность использования ShouldSerialize prefix свойство, чтобы исключить свойство вашего конкретного типа во время выполнения?

public class Employee
{
  public string Name { get; set; }
  public Employee Manager { get; set; }

  public bool ShouldSerializeManager()
  {
    return (Manager != this);
  }
}