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; } }
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)); }
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)); }
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)); }
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)); }
private IProtoSerializer BuildSerializer() { IProtoSerializer ser = new SubItemSerializer(derivedType.Type, derivedType.GetKey(false, false), derivedType); return(new TagDecorator(fieldNumber, WireType.String, false, ser)); }