|
@@ -57,6 +57,8 @@ namespace Grpc.Core
|
|
{
|
|
{
|
|
this.contextualSerializer = GrpcPreconditions.CheckNotNull(serializer, nameof(serializer));
|
|
this.contextualSerializer = GrpcPreconditions.CheckNotNull(serializer, nameof(serializer));
|
|
this.contextualDeserializer = GrpcPreconditions.CheckNotNull(deserializer, nameof(deserializer));
|
|
this.contextualDeserializer = GrpcPreconditions.CheckNotNull(deserializer, nameof(deserializer));
|
|
|
|
+ // TODO(jtattermusch): once gRPC C# library switches to using contextual (de)serializer,
|
|
|
|
+ // emulating the simple (de)serializer will become unnecessary.
|
|
this.serializer = EmulateSimpleSerializer;
|
|
this.serializer = EmulateSimpleSerializer;
|
|
this.deserializer = EmulateSimpleDeserializer;
|
|
this.deserializer = EmulateSimpleDeserializer;
|
|
}
|
|
}
|
|
@@ -87,6 +89,7 @@ namespace Grpc.Core
|
|
private byte[] EmulateSimpleSerializer(T msg)
|
|
private byte[] EmulateSimpleSerializer(T msg)
|
|
{
|
|
{
|
|
// TODO(jtattermusch): avoid the allocation by passing a thread-local instance
|
|
// TODO(jtattermusch): avoid the allocation by passing a thread-local instance
|
|
|
|
+ // This code will become unnecessary once gRPC C# library switches to using contextual (de)serializer.
|
|
var context = new EmulatedSerializationContext();
|
|
var context = new EmulatedSerializationContext();
|
|
this.contextualSerializer(msg, context);
|
|
this.contextualSerializer(msg, context);
|
|
return context.GetPayload();
|
|
return context.GetPayload();
|
|
@@ -96,6 +99,7 @@ namespace Grpc.Core
|
|
private T EmulateSimpleDeserializer(byte[] payload)
|
|
private T EmulateSimpleDeserializer(byte[] payload)
|
|
{
|
|
{
|
|
// TODO(jtattermusch): avoid the allocation by passing a thread-local instance
|
|
// TODO(jtattermusch): avoid the allocation by passing a thread-local instance
|
|
|
|
+ // This code will become unnecessary once gRPC C# library switches to using contextual (de)serializer.
|
|
var context = new EmulatedDeserializationContext(payload);
|
|
var context = new EmulatedDeserializationContext(payload);
|
|
return this.contextualDeserializer(context);
|
|
return this.contextualDeserializer(context);
|
|
}
|
|
}
|
|
@@ -134,6 +138,7 @@ namespace Grpc.Core
|
|
internal class EmulatedDeserializationContext : DeserializationContext
|
|
internal class EmulatedDeserializationContext : DeserializationContext
|
|
{
|
|
{
|
|
readonly byte[] payload;
|
|
readonly byte[] payload;
|
|
|
|
+ bool alreadyCalledPayloadAsNewBuffer;
|
|
|
|
|
|
public EmulatedDeserializationContext(byte[] payload)
|
|
public EmulatedDeserializationContext(byte[] payload)
|
|
{
|
|
{
|
|
@@ -144,6 +149,8 @@ namespace Grpc.Core
|
|
|
|
|
|
public override byte[] PayloadAsNewBuffer()
|
|
public override byte[] PayloadAsNewBuffer()
|
|
{
|
|
{
|
|
|
|
+ GrpcPreconditions.CheckState(!alreadyCalledPayloadAsNewBuffer);
|
|
|
|
+ alreadyCalledPayloadAsNewBuffer = true;
|
|
return payload;
|
|
return payload;
|
|
}
|
|
}
|
|
}
|
|
}
|