public async Task SerializeAsync(Stream stream, object message, Type type, CancellationToken cancellationToken = default) { using (var serializedMemory = SerializeCore(message, type)) { var uncompressed = serializedMemory.Memory; var compressedBuff = ArrayPool <byte> .Shared.Rent(LZ4Codec.MaximumOutputSize(uncompressed.Length) + HeaderLength); try { //write body, skip header var compressedLength = LZ4Codec.Encode( uncompressed.Span, new Span <byte>(compressedBuff, HeaderLength, compressedBuff.Length - HeaderLength)); //write header var offset = 0; SerializerBinary.WriteByte(ref compressedBuff, ref offset, Header); SerializerBinary.WriteInt32Fixed(ref compressedBuff, ref offset, compressedLength); SerializerBinary.WriteInt32Fixed(ref compressedBuff, ref offset, uncompressed.Length); await stream.WriteAsync(compressedBuff, 0, compressedLength + HeaderLength, cancellationToken).ConfigureAwait(false); } finally { ArrayPool <byte> .Shared.Return(compressedBuff); } } }
public void Serialize(ref byte[] buffer, ref int offset, Color value) { bool isKnown = value.IsKnownColor; SerializerBinary.WriteByte(ref buffer, ref offset, isKnown ? (byte)1 : (byte)0); if (isKnown) { int knownColor = (int)value.ToKnownColor(); SerializerBinary.WriteInt32Fixed(ref buffer, ref offset, knownColor); } else { SerializerBinary.WriteInt32Fixed(ref buffer, ref offset, value.ToArgb()); } }
public void Serialize(ref byte[] buffer, ref int offset, Color value) { SerializerBinary.WriteInt32Fixed(ref buffer, ref offset, value.ToArgb()); }