public override void EmitRead(CompilerContext ctx, Local valueFrom)
        {
            // make sure we have a non-stack-based source
            using var loc = ctx.GetLocalWithValue(typeof(T), valueFrom);
            var category = GetCategory();

            switch (category)
            {
            case SerializerFeatures.CategoryMessage:
            case SerializerFeatures.CategoryMessageWrappedAtRoot:
                SubItemSerializer.EmitReadMessage <T>(ctx, loc, serializerType: MetaType.SerializerType);
                break;

            case SerializerFeatures.CategoryScalar:
                EmitLoadCustomSerializer(ctx, MetaType.SerializerType, typeof(T));
                ctx.LoadState();
                ctx.LoadValue(loc);
                ctx.EmitCall(typeof(ISerializer <T>).GetMethod(nameof(ISerializer <T> .Read), BindingFlags.Public | BindingFlags.Instance));
                break;

            default:
                category.ThrowInvalidCategory();
                break;
            }
        }