Пример #1
0
        /// <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);
        }
Пример #2
0
        /// <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));
        }