private IEnumerable<MemberDefinition> EnumerateMembers()
{
var members = SpecifiedType.Members
.Select(x => new MemberDefinition(x, GetMemberName(x),
ValueFactory.Create(Context.Mode, Source, x, Context.Options)
));
if (Context.Mode.IsSerialize()) members = members
.Where(x => !x.Member.IsOptional || x.Value.HasValue)
.Where(x => !x.Member.IsProperty || x.Member.HasGetter)
.Where(x => Context.Options.Serialization.IncludeNullMembers || x.Value.Instance != null)
.Where(x => this.Walk<INode>(y => y.Parent).All(y => y.Value != x.Value.Instance));
if (Context.Mode.IsDeserialize()) members = members.Where(x => !x.Member.IsReadonly);
return members
.Where(x => DefaultMemberFilter.And(Context.Options.MemberFilter)(x.Member, Context.Options))
.Where(x => x.Value.SpecifiedType, x => Context.Options, Context.Options.TypeFilter).ToList();
}