public override void EmitWrite(CompilerContext ctx, Local valueFrom)
        {
            var category = GetCategory();

            switch (GetCategory())
            {
            case SerializerFeatures.CategoryMessage:
            case SerializerFeatures.CategoryMessageWrappedAtRoot:
                SubItemSerializer.EmitWriteMessage <T>(null, WireType.String, ctx, valueFrom, serializerType: MetaType.SerializerType);
                break;

            case SerializerFeatures.CategoryScalar:
                using (var loc = ctx.GetLocalWithValue(typeof(T), valueFrom))
                {
                    EmitLoadCustomSerializer(ctx, MetaType.SerializerType, typeof(T));
                    ctx.LoadState();
                    ctx.LoadValue(loc);
                    ctx.EmitCall(typeof(ISerializer <T>).GetMethod(nameof(ISerializer <T> .Write), BindingFlags.Public | BindingFlags.Instance));
                }
                break;

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