12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- #if FEAT_COMPILER
- using System;
- using ProtoBuf.Meta;
- namespace ProtoBuf.Serializers
- {
- sealed class CompiledSerializer : IProtoTypeSerializer
- {
- bool IProtoTypeSerializer.HasCallbacks(TypeModel.CallbackType callbackType)
- {
- return head.HasCallbacks(callbackType); // these routes only used when bits of the model not compiled
- }
- bool IProtoTypeSerializer.CanCreateInstance()
- {
- return head.CanCreateInstance();
- }
- object IProtoTypeSerializer.CreateInstance(ProtoReader source)
- {
- return head.CreateInstance(source);
- }
- public void Callback(object value, TypeModel.CallbackType callbackType, SerializationContext context)
- {
- head.Callback(value, callbackType, context); // these routes only used when bits of the model not compiled
- }
- public static CompiledSerializer Wrap(IProtoTypeSerializer head, TypeModel model)
- {
- CompiledSerializer result = head as CompiledSerializer;
- if (result == null)
- {
- result = new CompiledSerializer(head, model);
- Helpers.DebugAssert(((IProtoTypeSerializer)result).ExpectedType == head.ExpectedType);
- }
- return result;
- }
- private readonly IProtoTypeSerializer head;
- private readonly Compiler.ProtoSerializer serializer;
- private readonly Compiler.ProtoDeserializer deserializer;
- private CompiledSerializer(IProtoTypeSerializer head, TypeModel model)
- {
- this.head = head;
- serializer = Compiler.CompilerContext.BuildSerializer(head, model);
- deserializer = Compiler.CompilerContext.BuildDeserializer(head, model);
- }
- bool IProtoSerializer.RequiresOldValue => head.RequiresOldValue;
- bool IProtoSerializer.ReturnsValue => head.ReturnsValue;
- Type IProtoSerializer.ExpectedType => head.ExpectedType;
- void IProtoSerializer.Write(object value, ProtoWriter dest)
- {
- serializer(value, dest);
- }
- object IProtoSerializer.Read(object value, ProtoReader source)
- {
- return deserializer(value, source);
- }
- void IProtoSerializer.EmitWrite(Compiler.CompilerContext ctx, Compiler.Local valueFrom)
- {
- head.EmitWrite(ctx, valueFrom);
- }
- void IProtoSerializer.EmitRead(Compiler.CompilerContext ctx, Compiler.Local valueFrom)
- {
- head.EmitRead(ctx, valueFrom);
- }
- void IProtoTypeSerializer.EmitCallback(Compiler.CompilerContext ctx, Compiler.Local valueFrom, TypeModel.CallbackType callbackType)
- {
- head.EmitCallback(ctx, valueFrom, callbackType);
- }
- void IProtoTypeSerializer.EmitCreateInstance(Compiler.CompilerContext ctx)
- {
- head.EmitCreateInstance(ctx);
- }
- }
- }
- #endif
|