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;
            }
        }
        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;
            }
        }
Example #3
0
        private IProtoSerializer BuildSerializer()
        {
            // note the caller here is MetaType.BuildSerializer, which already has the sync-lock
            IProtoSerializer ser = new SubItemSerializer(derivedType.Type, derivedType.GetKey(false, false), derivedType, false);

            return(new TagDecorator(fieldNumber, WireType.String, false, ser));
        }
        private IProtoSerializer BuildSerializer()
        {
            WireType wireType = WireType.String;

            if (this.dataFormat == DataFormat.Group)
            {
                wireType = WireType.StartGroup;
            }
            IProtoSerializer subItemSerializer = new SubItemSerializer(this.derivedType.Type, this.derivedType.GetKey(false, false), this.derivedType, false);

            return(new TagDecorator(this.fieldNumber, wireType, false, subItemSerializer));
        }
Example #5
0
        private IProtoSerializer BuildSerializer()
        {
            WireType wireType = WireType.String;

            if (dataFormat == DataFormat.Group)
            {
                wireType = WireType.StartGroup;
            }
            IProtoSerializer tail = new SubItemSerializer(derivedType.Type, derivedType.GetKey(demand: false, getBaseKey: false), derivedType, recursionCheck: false);

            return(new TagDecorator(fieldNumber, wireType, strict: false, tail));
        }
Example #6
0
        private IProtoSerializer BuildSerializer()
        {
            // note the caller here is MetaType.BuildSerializer, which already has the sync-lock
            WireType wireType = WireType.String;

            if (dataFormat == DataFormat.Group)
            {
                wireType = WireType.StartGroup;                                // only one exception
            }
            IProtoSerializer ser = new SubItemSerializer(derivedType.Type, derivedType.GetKey(false, false), derivedType, false);

            return(new TagDecorator(fieldNumber, wireType, false, ser));
        }
Example #7
0
        private IRuntimeProtoSerializerNode BuildSerializer(Type parentType)
        {
            // note the caller here is MetaType.BuildSerializer, which already has the sync-lock
            WireType wireType = WireType.String;

            if (dataFormat == DataFormat.Group)
            {
                wireType = WireType.StartGroup;                                // only one exception
            }
            IRuntimeProtoSerializerNode ser = SubItemSerializer.Create(derivedType.Type, derivedType, parentType);

            return(new TagDecorator(fieldNumber, wireType, false, ser));
        }
Example #8
0
        private IProtoSerializer BuildSerializer()
        {
            IProtoSerializer ser = new SubItemSerializer(derivedType.Type, derivedType.GetKey(false, false), derivedType);

            return(new TagDecorator(fieldNumber, WireType.String, false, ser));
        }