Esempio n. 1
0
        private void GenerateSerialization(FreudManager manager, Type type, List <MemberInfo> dataMembers,
                                           List <ITypeInfo> parts)
        {
            var serializeStatements   = new List <Expression>();
            var deserializeStatements = new List <Expression>();

            var instVariable = Expression.Variable(type, "instance");

            for (int i = 0; i < dataMembers.Count; i++)
            {
                Expression serialization_call   = null;
                Expression deserialization_call = null;

                GenerateReferenceExpressions(type, instVariable, dataMembers[i], parts[i], out serialization_call,
                                             out deserialization_call);

                serializeStatements.Add(serialization_call);
                deserializeStatements.Add(deserialization_call);
            }

            _serialize = Expression.Lambda <Action <object, Stream> >(Expression.Block(serializeStatements.ToArray()),
                                                                      "serialize_ref<" + type.FullName + ">", true,
                                                                      new[] { _parameterExpression, ParameterExpression }).Compile();

            _deserialize = Expression.Lambda <Func <Stream, object> >(
                Expression.Block(new[] { instVariable },
                                 new[] { Expression.Assign(instVariable, Expression.New(type)) }
                                 .Concat(deserializeStatements.ToArray())
                                 .Concat(new[] { Expression.Convert(instVariable, typeof(Object)) }).ToArray()),
                "derialize_ref<" + type.FullName + ">", true,
                new[] { ParameterExpression })
                           .Compile();
        }
Esempio n. 2
0
        private void registerGeneral(Type type, FreudManager manager)
        {
            var dataMembers = GetAllowedTypeMembers(type);

            var parts = SelectMemberSerializers(manager, dataMembers);

            GenerateSerialization(manager, type, dataMembers, parts);
        }
Esempio n. 3
0
        private void registerArray(Type type, FreudManager manager)
        {
            registerType(type.GetElementType(), manager);

            var elementInfo = manager.TypeInfoCache[type.GetElementType()];

            var arraySerializer = new ArrayTypeInfo(type, elementInfo);

            _serialize   = arraySerializer.Serialize;
            _deserialize = arraySerializer.Deserialize;
        }
Esempio n. 4
0
        private static List <ITypeInfo> SelectMemberSerializers(FreudManager manager, List <MemberInfo> dataMembers)
        {
            var parts = new List <ITypeInfo>();

            foreach (var dataMember in dataMembers)
            {
                var memberType  = dataMember.PropertyOrFieldType();
                var newInstance = new ExpressionTypeInfo(memberType, manager);
                parts.Add(manager.TypeInfoCache[memberType]);
            }
            return(parts);
        }
Esempio n. 5
0
        private void registerType(Type type, FreudManager manager)
        {
            if (manager.TypeInfoCache.ContainsKey(type))
            {
                return;
            }

            checkType(type);

            if (type.IsArray)
            {
                registerArray(type, manager);
            }
            else
            {
                registerGeneral(type, manager);
            }

            manager.TypeInfoCache[type] = this;
        }
Esempio n. 6
0
 public ExpressionTypeInfo(Type targetType, FreudManager manager)
 {
     TargetType = targetType;
     registerType(targetType, manager);
 }
Esempio n. 7
0
 public ITypeInfo Create(Type type, FreudManager manager)
 {
     return(new ExpressionTypeInfo(type, manager));
 }