Skip to content

Commit c8f368a

Browse files
stebetmichaelklishin
authored andcommitted
Adding BinaryPrimitives support for NETSTANDARD targets for more optimized binary (de)serialization.
1 parent 70db583 commit c8f368a

10 files changed

+180
-153
lines changed

projects/Apigen/apigen/Apigen.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -935,8 +935,8 @@ public void EmitMethodArgumentReader()
935935
{
936936
EmitLine(" internal override Client.Impl.MethodBase DecodeMethodFrom(ReadOnlyMemory<byte> memory)");
937937
EmitLine(" {");
938-
EmitLine(" ushort classId = Util.NetworkOrderDeserializer.ReadUInt16(memory);");
939-
EmitLine(" ushort methodId = Util.NetworkOrderDeserializer.ReadUInt16(memory.Slice(2));");
938+
EmitLine(" ushort classId = Util.NetworkOrderDeserializer.ReadUInt16(memory.Span);");
939+
EmitLine(" ushort methodId = Util.NetworkOrderDeserializer.ReadUInt16(memory.Slice(2).Span);");
940940
EmitLine(" Client.Impl.MethodBase result = DecodeMethodFrom(classId, methodId);");
941941
EmitLine(" if(result != null)");
942942
EmitLine(" {");

projects/RabbitMQ.Client/client/impl/CommandAssembler.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ public Command HandleFrame(in InboundFrame f)
8989
{
9090
throw new UnexpectedFrameException(f.Type);
9191
}
92-
m_header = m_protocol.DecodeContentHeaderFrom(NetworkOrderDeserializer.ReadUInt16(f.Payload));
92+
m_header = m_protocol.DecodeContentHeaderFrom(NetworkOrderDeserializer.ReadUInt16(f.Payload.Span));
9393
ulong totalBodyBytes = m_header.ReadFrom(f.Payload.Slice(2));
9494
if (totalBodyBytes > MaxArrayOfBytesSize)
9595
{

projects/RabbitMQ.Client/client/impl/ContentHeaderBase.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ public virtual object Clone()
7070
internal ulong ReadFrom(ReadOnlyMemory<byte> memory)
7171
{
7272
// Skipping the first two bytes since they arent used (weight - not currently used)
73-
ulong bodySize = NetworkOrderDeserializer.ReadUInt64(memory.Slice(2));
73+
ulong bodySize = NetworkOrderDeserializer.ReadUInt64(memory.Slice(2).Span);
7474
ContentHeaderPropertyReader reader = new ContentHeaderPropertyReader(memory.Slice(10));
7575
ReadPropertiesFrom(ref reader);
7676
return bodySize;
@@ -83,8 +83,8 @@ internal ulong ReadFrom(ReadOnlyMemory<byte> memory)
8383

8484
internal int WriteTo(Memory<byte> memory, ulong bodySize)
8585
{
86-
NetworkOrderSerializer.WriteUInt16(memory, ZERO); // Weight - not used
87-
NetworkOrderSerializer.WriteUInt64(memory.Slice(2), bodySize);
86+
NetworkOrderSerializer.WriteUInt16(memory.Span, ZERO); // Weight - not used
87+
NetworkOrderSerializer.WriteUInt64(memory.Slice(2).Span, bodySize);
8888

8989
ContentHeaderPropertyWriter writer = new ContentHeaderPropertyWriter(memory.Slice(10));
9090
WritePropertiesTo(ref writer);

projects/RabbitMQ.Client/client/impl/ContentHeaderPropertyReader.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -84,21 +84,21 @@ public void ReadFlagWord()
8484
{
8585
throw new MalformedFrameException("Attempted to read flag word when none advertised");
8686
}
87-
m_flagWord = NetworkOrderDeserializer.ReadUInt16(_memory.Slice(_memoryOffset));
87+
m_flagWord = NetworkOrderDeserializer.ReadUInt16(_memory.Slice(_memoryOffset).Span);
8888
_memoryOffset += 2;
8989
m_bitCount = 0;
9090
}
9191

9292
public uint ReadLong()
9393
{
94-
uint result = NetworkOrderDeserializer.ReadUInt32(_memory.Slice(_memoryOffset));
94+
uint result = NetworkOrderDeserializer.ReadUInt32(_memory.Slice(_memoryOffset).Span);
9595
_memoryOffset += 4;
9696
return result;
9797
}
9898

9999
public ulong ReadLonglong()
100100
{
101-
ulong result = NetworkOrderDeserializer.ReadUInt64(_memory.Slice(_memoryOffset));
101+
ulong result = NetworkOrderDeserializer.ReadUInt64(_memory.Slice(_memoryOffset).Span);
102102
_memoryOffset += 8;
103103
return result;
104104
}
@@ -130,7 +130,7 @@ public bool ReadPresence()
130130

131131
public ushort ReadShort()
132132
{
133-
ushort result = NetworkOrderDeserializer.ReadUInt16(_memory.Slice(_memoryOffset));
133+
ushort result = NetworkOrderDeserializer.ReadUInt16(_memory.Slice(_memoryOffset).Span);
134134
_memoryOffset += 2;
135135
return result;
136136
}

projects/RabbitMQ.Client/client/impl/ContentHeaderPropertyWriter.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ public void WriteTimestamp(AmqpTimestamp val)
127127

128128
private void EmitFlagWord(bool continuationBit)
129129
{
130-
NetworkOrderSerializer.WriteUInt16(Memory.Slice(Offset), (ushort)(continuationBit ? (_flagWord | 1) : _flagWord));
130+
NetworkOrderSerializer.WriteUInt16(Memory.Slice(Offset).Span, (ushort)(continuationBit ? (_flagWord | 1) : _flagWord));
131131
Offset += 2;
132132
_flagWord = 0;
133133
_bitCount = 0;

projects/RabbitMQ.Client/client/impl/Frame.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ internal override int GetMinimumPayloadBufferSize()
7070
internal override int WritePayload(Memory<byte> memory)
7171
{
7272
// write protocol class id (2 bytes)
73-
NetworkOrderSerializer.WriteUInt16(memory, _header.ProtocolClassId);
73+
NetworkOrderSerializer.WriteUInt16(memory.Span, _header.ProtocolClassId);
7474
// write header (X bytes)
7575
int bytesWritten = _header.WriteTo(memory.Slice(2), (ulong)_bodyLength);
7676
return 2 + bytesWritten;
@@ -115,8 +115,8 @@ internal override int GetMinimumPayloadBufferSize()
115115

116116
internal override int WritePayload(Memory<byte> memory)
117117
{
118-
NetworkOrderSerializer.WriteUInt16(memory, _method.ProtocolClassId);
119-
NetworkOrderSerializer.WriteUInt16(memory.Slice(2), _method.ProtocolMethodId);
118+
NetworkOrderSerializer.WriteUInt16(memory.Span, _method.ProtocolClassId);
119+
NetworkOrderSerializer.WriteUInt16(memory.Slice(2).Span, _method.ProtocolMethodId);
120120
var argWriter = new MethodArgumentWriter(memory.Slice(4));
121121
_method.WriteArgumentsTo(ref argWriter);
122122
argWriter.Flush();
@@ -151,9 +151,9 @@ public OutboundFrame(FrameType type, int channel) : base(type, channel)
151151
internal void WriteTo(Memory<byte> memory)
152152
{
153153
memory.Span[0] = (byte)Type;
154-
NetworkOrderSerializer.WriteUInt16(memory.Slice(1), (ushort)Channel);
154+
NetworkOrderSerializer.WriteUInt16(memory.Slice(1).Span, (ushort)Channel);
155155
int bytesWritten = WritePayload(memory.Slice(7));
156-
NetworkOrderSerializer.WriteUInt32(memory.Slice(3), (uint)bytesWritten);
156+
NetworkOrderSerializer.WriteUInt32(memory.Slice(3).Span, (uint)bytesWritten);
157157
memory.Span[bytesWritten + 7] = Constants.FrameEnd;
158158
ByteCount = bytesWritten + 8;
159159
}

projects/RabbitMQ.Client/client/impl/MethodArgumentReader.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -82,15 +82,15 @@ public byte[] ReadContent()
8282
public uint ReadLong()
8383
{
8484
ClearBits();
85-
uint result = NetworkOrderDeserializer.ReadUInt32(_memory.Slice(_memoryOffset));
85+
uint result = NetworkOrderDeserializer.ReadUInt32(_memory.Slice(_memoryOffset).Span);
8686
_memoryOffset += 4;
8787
return result;
8888
}
8989

9090
public ulong ReadLonglong()
9191
{
9292
ClearBits();
93-
ulong result = NetworkOrderDeserializer.ReadUInt64(_memory.Slice(_memoryOffset));
93+
ulong result = NetworkOrderDeserializer.ReadUInt64(_memory.Slice(_memoryOffset).Span);
9494
_memoryOffset += 8;
9595
return result;
9696
}
@@ -112,7 +112,7 @@ public byte ReadOctet()
112112
public ushort ReadShort()
113113
{
114114
ClearBits();
115-
ushort result = NetworkOrderDeserializer.ReadUInt16(_memory.Slice(_memoryOffset));
115+
ushort result = NetworkOrderDeserializer.ReadUInt16(_memory.Slice(_memoryOffset).Span);
116116
_memoryOffset += 2;
117117
return result;
118118
}

projects/RabbitMQ.Client/client/impl/WireFormatting.cs

Lines changed: 28 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -95,8 +95,8 @@ public static void DecimalToAmqp(decimal value, out byte scale, out int mantissa
9595

9696
public static IList ReadArray(ReadOnlyMemory<byte> memory, out int bytesRead)
9797
{
98-
uint arrayLength = NetworkOrderDeserializer.ReadUInt32(memory);
99-
List<object> array = new List<object>((int)arrayLength);
98+
List<object> array = new List<object>();
99+
long arrayLength = NetworkOrderDeserializer.ReadUInt32(memory.Span);
100100
bytesRead = 4;
101101
while (bytesRead - 4 < arrayLength)
102102
{
@@ -111,7 +111,7 @@ public static IList ReadArray(ReadOnlyMemory<byte> memory, out int bytesRead)
111111
public static decimal ReadDecimal(ReadOnlyMemory<byte> memory)
112112
{
113113
byte scale = memory.Span[0];
114-
uint unsignedMantissa = NetworkOrderDeserializer.ReadUInt32(memory.Slice(1));
114+
uint unsignedMantissa = NetworkOrderDeserializer.ReadUInt32(memory.Slice(1).Span);
115115
return AmqpToDecimal(scale, unsignedMantissa);
116116
}
117117

@@ -127,10 +127,10 @@ public static object ReadFieldValue(ReadOnlyMemory<byte> memory, out int bytesRe
127127
return result;
128128
case 'I':
129129
bytesRead += 4;
130-
return NetworkOrderDeserializer.ReadInt32(slice);
130+
return NetworkOrderDeserializer.ReadInt32(slice.Span);
131131
case 'i':
132132
bytesRead += 4;
133-
return NetworkOrderDeserializer.ReadUInt32(slice);
133+
return NetworkOrderDeserializer.ReadUInt32(slice.Span);
134134
case 'D':
135135
bytesRead += 5;
136136
return ReadDecimal(slice);
@@ -153,16 +153,16 @@ public static object ReadFieldValue(ReadOnlyMemory<byte> memory, out int bytesRe
153153
return (sbyte)slice.Span[0];
154154
case 'd':
155155
bytesRead += 8;
156-
return NetworkOrderDeserializer.ReadDouble(slice);
156+
return NetworkOrderDeserializer.ReadDouble(slice.Span);
157157
case 'f':
158158
bytesRead += 4;
159-
return NetworkOrderDeserializer.ReadSingle(slice);
159+
return NetworkOrderDeserializer.ReadSingle(slice.Span);
160160
case 'l':
161161
bytesRead += 8;
162-
return NetworkOrderDeserializer.ReadInt64(slice);
162+
return NetworkOrderDeserializer.ReadInt64(slice.Span);
163163
case 's':
164164
bytesRead += 2;
165-
return NetworkOrderDeserializer.ReadInt16(slice);
165+
return NetworkOrderDeserializer.ReadInt16(slice.Span);
166166
case 't':
167167
bytesRead += 1;
168168
return slice.Span[0] != 0;
@@ -179,7 +179,7 @@ public static object ReadFieldValue(ReadOnlyMemory<byte> memory, out int bytesRe
179179

180180
public static byte[] ReadLongstr(ReadOnlyMemory<byte> memory)
181181
{
182-
int byteCount = (int)NetworkOrderDeserializer.ReadUInt32(memory);
182+
int byteCount = (int)NetworkOrderDeserializer.ReadUInt32(memory.Span);
183183
if (byteCount > int.MaxValue)
184184
{
185185
throw new SyntaxErrorException($"Long string too long; byte length={byteCount}, max={int.MaxValue}");
@@ -211,7 +211,7 @@ public static string ReadShortstr(ReadOnlyMemory<byte> memory, out int bytesRead
211211
public static Dictionary<string, object> ReadTable(ReadOnlyMemory<byte> memory, out int bytesRead)
212212
{
213213
Dictionary<string, object> table = new Dictionary<string, object>();
214-
long tableLength = NetworkOrderDeserializer.ReadUInt32(memory);
214+
long tableLength = NetworkOrderDeserializer.ReadUInt32(memory.Span);
215215
bytesRead = 4;
216216
while ((bytesRead - 4) < tableLength)
217217
{
@@ -231,7 +231,7 @@ public static Dictionary<string, object> ReadTable(ReadOnlyMemory<byte> memory,
231231

232232
public static AmqpTimestamp ReadTimestamp(ReadOnlyMemory<byte> memory)
233233
{
234-
ulong stamp = NetworkOrderDeserializer.ReadUInt64(memory);
234+
ulong stamp = NetworkOrderDeserializer.ReadUInt64(memory.Span);
235235
// 0-9 is afaict silent on the signedness of the timestamp.
236236
// See also MethodArgumentWriter.WriteTimestamp and AmqpTimestamp itself
237237
return new AmqpTimestamp((long)stamp);
@@ -241,7 +241,7 @@ public static int WriteArray(Memory<byte> memory, IList val)
241241
{
242242
if (val == null)
243243
{
244-
NetworkOrderSerializer.WriteUInt32(memory, 0);
244+
NetworkOrderSerializer.WriteUInt32(memory.Span, 0);
245245
return 4;
246246
}
247247
else
@@ -252,7 +252,7 @@ public static int WriteArray(Memory<byte> memory, IList val)
252252
bytesWritten += WriteFieldValue(memory.Slice(4 + bytesWritten), val[index]);
253253
}
254254

255-
NetworkOrderSerializer.WriteUInt32(memory, (uint)bytesWritten);
255+
NetworkOrderSerializer.WriteUInt32(memory.Span, (uint)bytesWritten);
256256
return 4 + bytesWritten;
257257
}
258258
}
@@ -296,7 +296,7 @@ public static int WriteFieldValue(Memory<byte> memory, object value)
296296
if (MemoryMarshal.TryGetArray(memory, out ArraySegment<byte> segment))
297297
{
298298
int bytesWritten = Encoding.UTF8.GetBytes(val, 0, val.Length, segment.Array, segment.Offset + 5);
299-
NetworkOrderSerializer.WriteUInt32(slice, (uint)bytesWritten);
299+
NetworkOrderSerializer.WriteUInt32(slice.Span, (uint)bytesWritten);
300300
return 5 + bytesWritten;
301301
}
302302

@@ -306,11 +306,11 @@ public static int WriteFieldValue(Memory<byte> memory, object value)
306306
return 1 + WriteLongstr(slice, val);
307307
case int val:
308308
memory.Span[0] = (byte)'I';
309-
NetworkOrderSerializer.WriteInt32(slice, val);
309+
NetworkOrderSerializer.WriteInt32(slice.Span, val);
310310
return 5;
311311
case uint val:
312312
memory.Span[0] = (byte)'i';
313-
NetworkOrderSerializer.WriteUInt32(slice, val);
313+
NetworkOrderSerializer.WriteUInt32(slice.Span, val);
314314
return 5;
315315
case decimal val:
316316
memory.Span[0] = (byte)'D';
@@ -334,19 +334,19 @@ public static int WriteFieldValue(Memory<byte> memory, object value)
334334
return 2;
335335
case double val:
336336
memory.Span[0] = (byte)'d';
337-
NetworkOrderSerializer.WriteDouble(slice, val);
337+
NetworkOrderSerializer.WriteDouble(slice.Span, val);
338338
return 9;
339339
case float val:
340340
memory.Span[0] = (byte)'f';
341-
NetworkOrderSerializer.WriteSingle(slice, val);
341+
NetworkOrderSerializer.WriteSingle(slice.Span, val);
342342
return 5;
343343
case long val:
344344
memory.Span[0] = (byte)'l';
345-
NetworkOrderSerializer.WriteInt64(slice, val);
345+
NetworkOrderSerializer.WriteInt64(slice.Span, val);
346346
return 9;
347347
case short val:
348348
memory.Span[0] = (byte)'s';
349-
NetworkOrderSerializer.WriteInt16(slice, val);
349+
NetworkOrderSerializer.WriteInt16(slice.Span, val);
350350
return 3;
351351
case bool val:
352352
memory.Span[0] = (byte)'t';
@@ -399,13 +399,13 @@ public static int GetFieldValueByteCount(object value)
399399

400400
public static int WriteLong(Memory<byte> memory, uint val)
401401
{
402-
NetworkOrderSerializer.WriteUInt32(memory, val);
402+
NetworkOrderSerializer.WriteUInt32(memory.Span, val);
403403
return 4;
404404
}
405405

406406
public static int WriteLonglong(Memory<byte> memory, ulong val)
407407
{
408-
NetworkOrderSerializer.WriteUInt64(memory, val);
408+
NetworkOrderSerializer.WriteUInt64(memory.Span, val);
409409
return 8;
410410
}
411411

@@ -423,7 +423,7 @@ public static int WriteLongstr(Memory<byte> memory, byte[] val, int index, int c
423423

424424
public static int WriteShort(Memory<byte> memory, ushort val)
425425
{
426-
NetworkOrderSerializer.WriteUInt16(memory, val);
426+
NetworkOrderSerializer.WriteUInt16(memory.Span, val);
427427
return 2;
428428
}
429429

@@ -448,7 +448,7 @@ public static int WriteTable(Memory<byte> memory, IDictionary val)
448448
{
449449
if (val == null)
450450
{
451-
NetworkOrderSerializer.WriteUInt32(memory, 0);
451+
NetworkOrderSerializer.WriteUInt32(memory.Span, 0);
452452
return 4;
453453
}
454454
else
@@ -462,7 +462,7 @@ public static int WriteTable(Memory<byte> memory, IDictionary val)
462462
bytesWritten += WriteFieldValue(slice.Slice(bytesWritten), entry.Value);
463463
}
464464

465-
NetworkOrderSerializer.WriteUInt32(memory, (uint)bytesWritten);
465+
NetworkOrderSerializer.WriteUInt32(memory.Span, (uint)bytesWritten);
466466
return 4 + bytesWritten;
467467
}
468468
}
@@ -471,7 +471,7 @@ public static int WriteTable(Memory<byte> memory, IDictionary<string, object> va
471471
{
472472
if (val == null)
473473
{
474-
NetworkOrderSerializer.WriteUInt32(memory, 0);
474+
NetworkOrderSerializer.WriteUInt32(memory.Span, 0);
475475
return 4;
476476
}
477477
else
@@ -485,7 +485,7 @@ public static int WriteTable(Memory<byte> memory, IDictionary<string, object> va
485485
bytesWritten += WriteFieldValue(slice.Slice(bytesWritten), entry.Value);
486486
}
487487

488-
NetworkOrderSerializer.WriteUInt32(memory, (uint)bytesWritten);
488+
NetworkOrderSerializer.WriteUInt32(memory.Span, (uint)bytesWritten);
489489
return 4 + bytesWritten;
490490
}
491491
}

0 commit comments

Comments
 (0)