diff --git a/src/csharp/Grpc.Core.Api/SerializationContext.cs b/src/csharp/Grpc.Core.Api/SerializationContext.cs index 1cc4b53619f..9e7d7d3a156 100644 --- a/src/csharp/Grpc.Core.Api/SerializationContext.cs +++ b/src/csharp/Grpc.Core.Api/SerializationContext.cs @@ -39,12 +39,22 @@ namespace Grpc.Core /// /// Gets buffer writer that can be used to write the serialized data. Once serialization is finished, - /// Complete() needs to be called. + /// Complete() needs to be called. A null value will be returned if serialization + /// with a buffer writer is not supported. + /// + public virtual IBufferWriter GetBufferWriter() + { + return null; + } + + /// + /// Sets the payload length when writing serialized data a buffer writer. This method should be called before GetBufferWriter. + /// Calling this method is optional. If the payload length is not set then the length is calculated using the data written to the + /// buffer writer when Complete() is called. /// /// The total length of the payload in bytes. - public virtual IBufferWriter GetBufferWriter(int payloadLength) + public virtual void SetPayloadLength(int payloadLength) { - throw new NotImplementedException(); } /// diff --git a/src/csharp/Grpc.Core.Tests/Internal/DefaultSerializationContextTest.cs b/src/csharp/Grpc.Core.Tests/Internal/DefaultSerializationContextTest.cs index 0245c370e66..061230d8ca4 100644 --- a/src/csharp/Grpc.Core.Tests/Internal/DefaultSerializationContextTest.cs +++ b/src/csharp/Grpc.Core.Tests/Internal/DefaultSerializationContextTest.cs @@ -84,7 +84,7 @@ namespace Grpc.Core.Internal.Tests var context = scope.Context; var origPayload = GetTestBuffer(payloadSize); - var bufferWriter = context.GetBufferWriter(payloadSize); + var bufferWriter = context.GetBufferWriter(); origPayload.AsSpan().CopyTo(bufferWriter.GetSpan(payloadSize)); bufferWriter.Advance(payloadSize); context.Complete(); @@ -106,7 +106,7 @@ namespace Grpc.Core.Internal.Tests var context = scope.Context; var origPayload = GetTestBuffer(payloadSize); - var bufferWriter = context.GetBufferWriter(payloadSize); + var bufferWriter = context.GetBufferWriter(); origPayload.AsSpan().CopyTo(bufferWriter.GetMemory(payloadSize).Span); bufferWriter.Advance(payloadSize); context.Complete(); @@ -131,7 +131,7 @@ namespace Grpc.Core.Internal.Tests var context = scope.Context; var origPayload = GetTestBuffer(payloadSize); - var bufferWriter = context.GetBufferWriter(payloadSize); + var bufferWriter = context.GetBufferWriter(); for (int offset = 0; offset < payloadSize; offset += maxSliceSize) { var sliceSize = Math.Min(maxSliceSize, payloadSize - offset); @@ -165,7 +165,7 @@ namespace Grpc.Core.Internal.Tests var origPayload2 = GetTestBuffer(20); - var bufferWriter = context.GetBufferWriter(20); + var bufferWriter = context.GetBufferWriter(); origPayload2.AsSpan().CopyTo(bufferWriter.GetMemory(origPayload2.Length).Span); bufferWriter.Advance(origPayload2.Length); context.Complete(); @@ -185,7 +185,7 @@ namespace Grpc.Core.Internal.Tests var context = scope.Context; context.Complete(GetTestBuffer(10)); - Assert.Throws(typeof(InvalidOperationException), () => context.GetBufferWriter(10)); + Assert.Throws(typeof(InvalidOperationException), () => context.GetBufferWriter()); } } diff --git a/src/csharp/Grpc.Core/Internal/DefaultSerializationContext.cs b/src/csharp/Grpc.Core/Internal/DefaultSerializationContext.cs index 6d8795df970..981ff69dbdc 100644 --- a/src/csharp/Grpc.Core/Internal/DefaultSerializationContext.cs +++ b/src/csharp/Grpc.Core/Internal/DefaultSerializationContext.cs @@ -50,12 +50,17 @@ namespace Grpc.Core.Internal /// /// Expose serializer as buffer writer /// - public override IBufferWriter GetBufferWriter(int payloadLength) + public override IBufferWriter GetBufferWriter() { GrpcPreconditions.CheckState(!isComplete); return sliceBuffer; } + public override void SetPayloadLength(int payloadLength) + { + // Length is calculated using the buffer writer + } + /// /// Complete the payload written so far. ///