Expanding on Brian Rogers' answer: It's a little bit simpler/faster to filter out the members to exclude in an override of GetSerializableMembers()
method rather than the CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
which gets called for on each MemberInfo
returned by GetSerializedMembers()
to avoid unnecessary calls to the CreateProperty method which does a bunch of reflection and delegate creation.
public class ExcludeObsoletePropertiesResolver : DefaultContractResolver
{
protected override List<MemberInfo> GetSerializableMembers(Type objectType)
{
var members = base.GetSerializableMembers(objectType);
members.RemoveAll(m => m.IsDefined(typeof(ObsoleteAttribute), true));
return members;
}
}
Usage:
var settings = new JsonSerializerSettings
{
ContractResolver = new ExcludeObsoletePropertiesResolver()
};
var json = JsonConvert.SerializeObject(foo, settings);