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.
///