Files
TEngine/Assets/GameScripts/ThirdParty/Protobuf-net/Serializers/CompiledSerializer.cs
ALEXTANG 0c8f3a5f92 [+] TEngineServer
[+] TEngineServer
2023-07-13 17:17:26 +08:00

88 lines
2.9 KiB
C#

#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