コード例 #1
0
 /// <summary>
 ///		Creates the serializer type built now and returns its new instance.
 /// </summary>
 /// <param name="context">The <see cref="SerializationContext"/> to holds serializers.</param>
 /// <param name="builder">The builder which implements actions initialization emit.</param>
 /// <param name="targetInfo">The information of the target.</param>
 /// <param name="schema">The <see cref="PolymorphismSchema"/> for this instance.</param>
 /// <param name="capabilities">The capabilities of the generating serializer.</param>
 /// <returns>
 ///		Newly built <see cref="MessagePackSerializer"/> instance.
 ///		This value will not be <c>null</c>.
 ///	</returns>
 public MessagePackSerializer CreateObjectInstance(
     AssemblyBuilderEmittingContext context,
     AssemblyBuilderSerializerBuilder builder,
     SerializationTarget targetInfo,
     PolymorphismSchema schema,
     SerializerCapabilities?capabilities
     )
 {
     return(this.CreateObjectConstructor(context, builder, targetInfo, capabilities)(context.SerializationContext, schema));
 }
コード例 #2
0
        public Func <SerializationContext, PolymorphismSchema, MessagePackSerializer> CreateObjectConstructor(AssemblyBuilderEmittingContext context, AssemblyBuilderSerializerBuilder builder, SerializationTarget targetInfo)
        {
            var hasPackActions        = targetInfo != null && !typeof(IPackable).IsAssignableFrom(builder.TargetType);
            var hasUnpackActions      = targetInfo != null && !typeof(IUnpackable).IsAssignableFrom(builder.TargetType);
            var hasUnpackActionTables = hasUnpackActions && targetInfo.Members.Any(m => m.Member != null);               // Except tuples

#if FEATURE_TAP
            var hasPackAsyncActions        = targetInfo != null && !typeof(IAsyncPackable).IsAssignableFrom(builder.TargetType);
            var hasUnpackAsyncActions      = targetInfo != null && !typeof(IAsyncUnpackable).IsAssignableFrom(builder.TargetType);
            var hasUnpackAsyncActionTables = hasUnpackAsyncActions && targetInfo.Members.Any(m => m.Member != null);               // Except tuples
#endif // FEATURE_TAP
            // ReSharper disable RedundantDelegateCreation
            Func <bool, Func <ILConstruct> > packActionsInitialization =
                isAsync =>
                new Func <ILConstruct>(() => builder.EmitPackOperationListInitialization(context, targetInfo, isAsync));
            Func <bool, Func <ILConstruct> > packActionTableInitialization =
                isAsync =>
                new Func <ILConstruct>(() => builder.EmitPackOperationTableInitialization(context, targetInfo, isAsync));
            Func <bool, Func <ILConstruct> > unpackActionsInitialization =
                isAsync => new Func <ILConstruct>(() => builder.EmitUnpackOperationListInitialization(context, targetInfo, isAsync));
            Func <bool, Func <ILConstruct> > unpackActionTableInitialization =
                isAsync => new Func <ILConstruct>(() => builder.EmitUnpackOperationTableInitialization(context, targetInfo, isAsync));
            // ReSharper restore RedundantDelegateCreation

            var contextfulConstructor =
                this.CreateConstructor(
                    MethodAttributes.Public,
                    ConstructorParameterTypes,
                    (type, il) =>
                    this.CreateContextfulObjectConstructor(
                        context,
                        type,
                        il,
                        hasPackActions
                                                                ? packActionsInitialization(false)
                                                                : default(Func <ILConstruct>),
                        hasPackActions
                                                                ? packActionTableInitialization(false)
                                                                : default(Func <ILConstruct>),
                        hasUnpackActions
                                                                ? unpackActionsInitialization(false)
                                                                : default(Func <ILConstruct>),
                        hasUnpackActionTables
                                                                ? unpackActionTableInitialization(false)
                                                                : default(Func <ILConstruct>),
#if FEATURE_TAP
                        hasPackAsyncActions&& context.SerializationContext.SerializerOptions.WithAsync
                                                                ? packActionsInitialization(true)
                                                                : default(Func <ILConstruct>),
                        hasPackAsyncActions && context.SerializationContext.SerializerOptions.WithAsync
                                                                ? packActionTableInitialization(true)
                                                                : default(Func <ILConstruct>),
                        hasUnpackAsyncActions && context.SerializationContext.SerializerOptions.WithAsync
                                                                ? unpackActionsInitialization(true)
                                                                : default(Func <ILConstruct>),
                        hasUnpackAsyncActionTables && context.SerializationContext.SerializerOptions.WithAsync
                                                                ? unpackActionTableInitialization(true)
                                                                : default(Func <ILConstruct>),
#endif // FEATURE_TAP
                        (
                            hasUnpackActions
#if FEATURE_TAP
                            || hasUnpackAsyncActions
#endif // FEATURE_TAP
                        ) ? () => builder.EmitMemberListInitialization(context, targetInfo)
                                                                : default(Func <ILConstruct>),
                        context.IsUnpackToUsed
                                                                ? () => builder.EmitUnpackToInitialization(context)
                                                                : default(Func <ILConstruct>)
                        )
                    );
            this.CreateConstructor(
                MethodAttributes.Public,
                ReflectionAbstractions.EmptyTypes,
                (_, il) => CreateDefaultObjectConstructor(contextfulConstructor, il)
                );

#if !NETSTANDARD1_1 && !NETSTANDARD1_3
            var ctor = this._typeBuilder.CreateType().GetConstructor(ConstructorParameterTypes);
#else
            var ctor = this._typeBuilder.CreateTypeInfo().GetConstructor(ConstructorParameterTypes);
#endif // !NETSTANDARD1_1 && !NETSTANDARD1_3
            var contextParameter = Expression.Parameter(typeof(SerializationContext), "context");
            var schemaParameter  = Expression.Parameter(typeof(PolymorphismSchema), "schema");
#if DEBUG
            Contract.Assert(ctor != null, "ctor != null");
#endif
            return
                (Expression.Lambda <Func <SerializationContext, PolymorphismSchema, MessagePackSerializer> >(
                     Expression.New(
                         ctor,
                         contextParameter
                         ),
                     contextParameter,
                     schemaParameter
                     ).Compile());
        }
コード例 #3
0
        public Func <SerializationContext, PolymorphismSchema, MessagePackSerializer> CreateObjectConstructor(
            AssemblyBuilderEmittingContext context,
            AssemblyBuilderSerializerBuilder builder,
            SerializationTarget targetInfo,
            SerializerCapabilities?capabilities
            )
        {
            var hasPackActions        = targetInfo != null && !typeof(IPackable).IsAssignableFrom(builder.TargetType);
            var hasUnpackActions      = targetInfo != null && !typeof(IUnpackable).IsAssignableFrom(builder.TargetType);
            var hasUnpackActionTables = hasUnpackActions && targetInfo.Members.Any(m => m.Member != null);               // Except tuples

#if FEATURE_TAP
            var hasPackAsyncActions        = targetInfo != null && !typeof(IAsyncPackable).IsAssignableFrom(builder.TargetType);
            var hasUnpackAsyncActions      = targetInfo != null && !typeof(IAsyncUnpackable).IsAssignableFrom(builder.TargetType);
            var hasUnpackAsyncActionTables = hasUnpackAsyncActions && targetInfo.Members.Any(m => m.Member != null);               // Except tuples
#endif // FEATURE_TAP
            // ReSharper disable RedundantDelegateCreation
            Func <bool, Func <ILConstruct> > packActionsInitialization =
                isAsync =>
                new Func <ILConstruct>(() => builder.EmitPackOperationListInitialization(context, targetInfo, isAsync));
            Func <bool, Func <ILConstruct> > packActionTableInitialization =
                isAsync =>
                new Func <ILConstruct>(() => builder.EmitPackOperationTableInitialization(context, targetInfo, isAsync));
            Func <ILConstruct> nullCheckerTableInitializtion             = () => builder.EmitPackNullCheckerTableInitialization(context, targetInfo);
            Func <bool, Func <ILConstruct> > unpackActionsInitialization =
                isAsync => new Func <ILConstruct>(() => builder.EmitUnpackOperationListInitialization(context, targetInfo, isAsync));
            Func <bool, Func <ILConstruct> > unpackActionTableInitialization =
                isAsync => new Func <ILConstruct>(() => builder.EmitUnpackOperationTableInitialization(context, targetInfo, isAsync));
            // ReSharper restore RedundantDelegateCreation

            var contextfulConstructor =
                this.CreateConstructor(
                    MethodAttributes.Public,
                    ConstructorParameterTypesWithoutCapabilities,
                    (type, il) =>
                    this.CreateContextfulObjectConstructor(
                        context,
                        type,
                        capabilities,
                        il,
                        hasPackActions
                                                                ? packActionsInitialization(false)
                                                                : default(Func <ILConstruct>),
                        hasPackActions
                                                                ? packActionTableInitialization(false)
                                                                : default(Func <ILConstruct>),
#if DEBUG
                        !SerializerDebugging.UseLegacyNullMapEntryHandling &&
#endif // DEBUG
                        hasPackActions
#if FEATURE_TAP
                        || hasPackAsyncActions
#endif // FEATURE_TAP
                                                                ? nullCheckerTableInitializtion
                                                                : default(Func <ILConstruct>),
                        hasUnpackActions
                                                                ? unpackActionsInitialization(false)
                                                                : default(Func <ILConstruct>),
                        hasUnpackActionTables
                                                                ? unpackActionTableInitialization(false)
                                                                : default(Func <ILConstruct>),
#if FEATURE_TAP
                        hasPackAsyncActions&& context.SerializationContext.SerializerOptions.WithAsync
                                                                ? packActionsInitialization(true)
                                                                : default(Func <ILConstruct>),
                        hasPackAsyncActions && context.SerializationContext.SerializerOptions.WithAsync
                                                                ? packActionTableInitialization(true)
                                                                : default(Func <ILConstruct>),
                        hasUnpackAsyncActions && context.SerializationContext.SerializerOptions.WithAsync
                                                                ? unpackActionsInitialization(true)
                                                                : default(Func <ILConstruct>),
                        hasUnpackAsyncActionTables && context.SerializationContext.SerializerOptions.WithAsync
                                                                ? unpackActionTableInitialization(true)
                                                                : default(Func <ILConstruct>),
#endif // FEATURE_TAP
                        (
                            hasUnpackActions
#if FEATURE_TAP
                            || hasUnpackAsyncActions
#endif // FEATURE_TAP
                        ) ? () => builder.EmitMemberListInitialization(context, targetInfo)
                                                                : default(Func <ILConstruct>),
                        context.IsUnpackToUsed
                                                                ? () => builder.EmitUnpackToInitialization(context)
                                                                : default(Func <ILConstruct>)
                        )
                    );
            this.CreateConstructor(
                MethodAttributes.Public,
                ReflectionAbstractions.EmptyTypes,
                (_, il) => CreateDefaultObjectConstructor(contextfulConstructor, il)
                );

#if !NETSTANDARD1_1 && !NETSTANDARD1_3 && !NETSTANDARD2_0
            var ctor = this._typeBuilder.CreateType().GetConstructor(ConstructorParameterTypesWithoutCapabilities);
#else
            var ctor = this._typeBuilder.CreateTypeInfo().GetConstructor(ConstructorParameterTypesWithoutCapabilities);
#endif // !NETSTANDARD1_1 && !NETSTANDARD1_3 && !NETSTANDARD2_0

#if DEBUG
            Contract.Assert(ctor != null, "ctor != null");
#endif
            var actualFunc = ctor.CreateConstructorDelegate <Func <SerializationContext, MessagePackSerializer> >();
            return((c, _) => actualFunc(c));
        }