M Packets/NosSmooth.PacketSerializer.Abstractions/PacketStringBuilder.cs => Packets/NosSmooth.PacketSerializer.Abstractions/PacketStringBuilder.cs +19 -0
@@ 16,6 16,7 @@ namespace NosSmooth.PacketSerializer.Abstractions;
public ref struct PacketStringBuilder
{
private Span<char> _buffer;
+ private char[]? _bufferArray;
private int _position;
private StringBuilderLevel _currentLevel;
private char? _insertSeparator;
@@ 31,6 32,7 @@ public ref struct PacketStringBuilder
_insertSeparator = null;
_buffer = initialBuffer;
_position = 0;
+ _bufferArray = null;
}
/// <summary>
@@ 226,6 228,17 @@ public ref struct PacketStringBuilder
public void Append(decimal value)
=> AppendSpanFormattable(value);
+ /// <summary>
+ /// Returns buffer to ArrayPool if it has been used.
+ /// </summary>
+ public void Dispose()
+ {
+ if (_bufferArray is not null)
+ {
+ ArrayPool<char>.Shared.Return(_bufferArray);
+ }
+ }
+
private void AppendSpanFormattable<T>(T value)
where T : ISpanFormattable
{
@@ 248,6 261,12 @@ public ref struct PacketStringBuilder
_buffer.CopyTo(newBuffer);
_buffer = newBuffer;
+
+ if (_bufferArray is not null)
+ {
+ ArrayPool<char>.Shared.Return(_bufferArray);
+ }
+ _bufferArray = newBuffer;
}
private void BeforeAppend()
M Packets/NosSmooth.PacketSerializer/PacketSerializer.cs => Packets/NosSmooth.PacketSerializer/PacketSerializer.cs +1 -1
@@ 34,7 34,7 @@ public class PacketSerializer : IPacketSerializer
/// <inheritdoc/>
public Result<string> Serialize(IPacket obj)
{
- var stringBuilder = new PacketStringBuilder(stackalloc char[500]);
+ using var stringBuilder = new PacketStringBuilder(stackalloc char[500]);
var infoResult = _packetTypesRepository.FindPacketInfo(obj.GetType());
if (!infoResult.IsSuccess)
{