/// <summary> /// Recurse the bindings for serialization. /// </summary> /// <param name="list">The list of <see cref="MemberBinding"/>.</param> /// <param name="state">The <see cref="SerializationState"/>.</param> /// <returns>The list of serialized bindings.</returns> private IEnumerable <object> SerializeBindings(IEnumerable <MemberBinding> list, SerializationState state) { var result = new List <object>(); foreach (var binding in list) { switch (binding) { case MemberAssignment assignment: var serializableBinding = new MemberBindingAssignment { Expression = Serializer.Serialize(assignment.Expression, state), MemberInfoKey = GetKeyForMember(assignment.Member), }; result.Add(serializableBinding); break; case MemberMemberBinding memberBinding: var memberBindingSerializable = new MemberBindingMember { MemberKey = GetKeyForMember(memberBinding.Member), }; memberBindingSerializable.Bindings.AddRange( SerializeBindings(memberBinding.Bindings, state)); result.Add(memberBindingSerializable); break; case MemberListBinding listBinding: var memberListSerializable = new MemberBindingList { MemberKey = GetKeyForMember(listBinding.Member), }; foreach (var initializer in listBinding.Initializers) { var init = new MemberBindingInitializer { AddMethodKey = GetKeyForMember(initializer.AddMethod), }; foreach (var argument in initializer.Arguments) { init.Arguments.Add(Serializer.Serialize(argument, state)); } memberListSerializable.Initializers.Add(init); } result.Add(memberListSerializable); break; } } return(result); }
/// <summary> /// Deserializes a member binding. /// </summary> /// <param name="element">The <see cref="MemberBindingMember"/> to parse.</param> /// <param name="state">The <seealso cref="SerializationState"/>.</param> /// <returns>The <see cref="MemberMemberBinding"/>.</returns> private MemberBinding DeserializeMember( MemberBindingMember element, SerializationState state) { var memberKey = element.MemberKey; typesCompressor.Value.DecompressTypes( state.TypeIndex, (memberKey, newKey => memberKey = newKey)); var member = GetMemberFromKey(memberKey); AuthorizeMembers(member); var bindings = DeserializeBindings( element.Bindings, state).ToArray(); return(Expression.MemberBind(member, bindings)); }