Ejemplo n.º 1
0
        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;
        }