public static async Task<byte[]> PackFileTransferMessageAsync(SongTransferMessage message) { byte[] serialized; using (var ms = new MemoryStream()) { using (var writer = new BsonWriter(ms)) { var serializer = new JsonSerializer(); await Task.Run(() => serializer.Serialize(writer, message)); } // Don't return earlier here, we don't know of the BsonWriter is finished. serialized = ms.ToArray(); } byte[] length = BitConverter.GetBytes(serialized.Length); // We have a fixed size of 4 bytes var returnData = new byte[length.Length + serialized.Length]; // We could simply call .ToArray() everywhere, but with Buffer.BlockCopy, we are // reducing memory pressure and CPU time on mobile devices by an order of magnitude Buffer.BlockCopy(length, 0, returnData, 0, length.Length); Buffer.BlockCopy(serialized, 0, returnData, length.Length, serialized.Length); return returnData; }