Ejemplo n.º 1
0
        protected void ImplementGetObjectData(ClassEmitter emitter)
        {
            var getObjectData = emitter.CreateMethod(
                "GetObjectData",
                typeof(void),
                new[] { typeof(SerializationInfo), typeof(StreamingContext) }
                );
            var info = getObjectData.Arguments[0];

            var typeLocal = getObjectData.CodeBuilder.DeclareLocal(typeof(Type));

            getObjectData.CodeBuilder.AddStatement(
                new AssignStatement(
                    typeLocal,
                    new MethodInvocationExpression(
                        null,
                        TypeMethods.StaticGetType,
                        new LiteralStringExpression(
                            typeof(ProxyObjectReference).AssemblyQualifiedName
                            ),
                        new LiteralBoolExpression(true),
                        new LiteralBoolExpression(false)
                        )
                    )
                );

            getObjectData.CodeBuilder.AddStatement(
                new MethodInvocationExpression(info, SerializationInfoMethods.SetType, typeLocal)
                );

            foreach (var field in emitter.GetAllFields())
            {
                if (field.Reference.IsStatic)
                {
                    continue;
                }
                if (field.Reference.IsNotSerialized)
                {
                    continue;
                }
                AddAddValueInvocation(info, getObjectData, field);
            }

            var interfacesLocal = getObjectData.CodeBuilder.DeclareLocal(typeof(string[]));

            getObjectData.CodeBuilder.AddStatement(
                new AssignStatement(
                    interfacesLocal,
                    new NewArrayExpression(interfaces.Length, typeof(string))
                    )
                );

            for (var i = 0; i < interfaces.Length; i++)
            {
                getObjectData.CodeBuilder.AddStatement(
                    new AssignArrayStatement(
                        interfacesLocal,
                        i,
                        new LiteralStringExpression(interfaces[i].AssemblyQualifiedName)
                        )
                    );
            }

            getObjectData.CodeBuilder.AddStatement(
                new MethodInvocationExpression(
                    info,
                    SerializationInfoMethods.AddValue_Object,
                    new LiteralStringExpression("__interfaces"),
                    interfacesLocal
                    )
                );

            getObjectData.CodeBuilder.AddStatement(
                new MethodInvocationExpression(
                    info,
                    SerializationInfoMethods.AddValue_Object,
                    new LiteralStringExpression("__baseType"),
                    new LiteralStringExpression(emitter.BaseType.AssemblyQualifiedName)
                    )
                );

            getObjectData.CodeBuilder.AddStatement(
                new MethodInvocationExpression(
                    info,
                    SerializationInfoMethods.AddValue_Object,
                    new LiteralStringExpression("__proxyGenerationOptions"),
                    emitter.GetField("proxyGenerationOptions")
                    )
                );

            getObjectData.CodeBuilder.AddStatement(
                new MethodInvocationExpression(
                    info,
                    SerializationInfoMethods.AddValue_Object,
                    new LiteralStringExpression("__proxyTypeId"),
                    new LiteralStringExpression(proxyTypeId)
                    )
                );

            CustomizeGetObjectData(
                getObjectData.CodeBuilder,
                info,
                getObjectData.Arguments[1],
                emitter
                );

            getObjectData.CodeBuilder.AddStatement(new ReturnStatement());
        }
Ejemplo n.º 2
0
        protected void ImplementGetObjectData(ClassEmitter emitter)
        {
            var           serializationInfo = new ArgumentReference(typeof(SerializationInfo));
            var           streamingContext  = new ArgumentReference(typeof(StreamingContext));
            MethodEmitter getObjectData     = emitter.CreateMethod("GetObjectData", serializationInfo, streamingContext);

            LocalReference typeLocal = getObjectData.CodeBuilder.DeclareLocal(typeof(Type));

            getObjectData.CodeBuilder.AddStatement(
                new AssignStatement(
                    typeLocal,
                    new MethodInvocationExpression(
                        null,
                        TypeMethods.StaticGetType,
                        new ConstReference(typeof(ProxyObjectReference).AssemblyQualifiedName).ToExpression(),
                        new ConstReference(1).ToExpression(),
                        new ConstReference(0).ToExpression())));

            getObjectData.CodeBuilder.AddStatement(
                new ExpressionStatement(
                    new MethodInvocationExpression(
                        serializationInfo,
                        SerializationInfoMethods.SetType,
                        typeLocal.ToExpression())));

            foreach (var field in emitter.GetAllFields())
            {
                if (field.Reference.IsStatic)
                {
                    continue;
                }
                if (field.Reference.IsNotSerialized)
                {
                    continue;
                }
                AddAddValueInvocation(serializationInfo, getObjectData, field);
            }

            LocalReference interfacesLocal = getObjectData.CodeBuilder.DeclareLocal(typeof(string[]));

            getObjectData.CodeBuilder.AddStatement(
                new AssignStatement(
                    interfacesLocal,
                    new NewArrayExpression(interfaces.Length, typeof(string))));

            for (int i = 0; i < interfaces.Length; i++)
            {
                getObjectData.CodeBuilder.AddStatement(
                    new AssignArrayStatement(
                        interfacesLocal,
                        i,
                        new ConstReference(interfaces[i].AssemblyQualifiedName).ToExpression()));
            }

            getObjectData.CodeBuilder.AddStatement(
                new ExpressionStatement(
                    new MethodInvocationExpression(
                        serializationInfo,
                        SerializationInfoMethods.AddValue_Object,
                        new ConstReference("__interfaces").ToExpression(),
                        interfacesLocal.ToExpression())));

            getObjectData.CodeBuilder.AddStatement(
                new ExpressionStatement(
                    new MethodInvocationExpression(
                        serializationInfo,
                        SerializationInfoMethods.AddValue_Object,
                        new ConstReference("__baseType").ToExpression(),
                        new ConstReference(emitter.BaseType.AssemblyQualifiedName).ToExpression())));

            getObjectData.CodeBuilder.AddStatement(
                new ExpressionStatement(
                    new MethodInvocationExpression(
                        serializationInfo,
                        SerializationInfoMethods.AddValue_Object,
                        new ConstReference("__proxyGenerationOptions").ToExpression(),
                        emitter.GetField("proxyGenerationOptions").ToExpression())));



            getObjectData.CodeBuilder.AddStatement(
                new ExpressionStatement(
                    new MethodInvocationExpression(serializationInfo,
                                                   SerializationInfoMethods.AddValue_Object,
                                                   new ConstReference("__proxyTypeId").ToExpression(),
                                                   new ConstReference(proxyTypeId).ToExpression())));

            CustomizeGetObjectData(getObjectData.CodeBuilder, serializationInfo, streamingContext, emitter);

            getObjectData.CodeBuilder.AddStatement(new ReturnStatement());
        }