using Newtonsoft.Json; using Newtonsoft.Json.Serialization; using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; namespace Tango.BL.Serialization { public class SerializableEntityContractResolver : DefaultContractResolver { private EntitySerializationStrategy _serializationStrategy; private EntitySerializationFlags _flags; private EntitySerializationStrategy _current_object_strategy; public SerializableEntityContractResolver(EntitySerializationStrategy serializationStrategy, EntitySerializationFlags flags) { _serializationStrategy = serializationStrategy; _flags = flags; } protected override JsonObjectContract CreateObjectContract(Type objectType) { _current_object_strategy = new EntitySerializationStrategy(); if (typeof(ISerializableEntity).IsAssignableFrom(objectType)) { _current_object_strategy = (Activator.CreateInstance(objectType) as ISerializableEntity).GetDefaultSerializationStrategy(_flags); } return base.CreateObjectContract(objectType); } protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization) { var ignore_props = _serializationStrategy.IgnoreProperties.Concat(_current_object_strategy.IgnoreProperties).Where(x => x != null).Distinct().ToList(); var include_props = _serializationStrategy.IncludeProperties.Concat(_current_object_strategy.IncludeProperties).Where(x => x != null).Distinct().ToList(); JsonProperty property = base.CreateProperty(member, memberSerialization); property.Ignored = false; property.ShouldSerialize = (x) => { MemberInfo mi = member; return (!ignore_props.Exists(y => y.DeclaringType.IsAssignableFrom(mi.DeclaringType) && y.ToString() == mi.ToString())) || (include_props.Exists(y => y.DeclaringType.IsAssignableFrom(mi.DeclaringType) && y.ToString() == mi.ToString())); }; property.ShouldDeserialize = (x) => { MemberInfo mi = member; return (!ignore_props.Exists(y => y.DeclaringType.IsAssignableFrom(mi.DeclaringType) && y.ToString() == mi.ToString())) || (include_props.Exists(y => y.DeclaringType.IsAssignableFrom(mi.DeclaringType) && y.ToString() == mi.ToString())); }; return property; } } }