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()); }
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()); }