/// <summary>
        ///     Asynchronously deserializes object from the stream and returns it.
        /// </summary>
        /// <param name="stream"></param>
        /// <returns></returns>
        public static async Task <SerializationObjectWrapper> DeserializeAsync(Stream stream)
        {
            int length = 0;

            if (!await Task.Factory.StartNew(
                    () => Serializer.TryReadLengthPrefix(stream, PrefixStyle.Base128, out length),
                    TaskCreationOptions.DenyChildAttach))
            {
                throw new ArgumentException();
            }

            var buffer = new byte[length];
            await stream.ReadAsync(buffer, 0, buffer.Length);

            using (MemoryStream ms = new MemoryStream())
            {
                await ms.WriteAsync(buffer, 0, buffer.Length);

                ms.Position = 0;

                SerializationObjectWrapper wrapper = Serializer.Deserialize <SerializationObjectWrapper>(ms);

                return(wrapper);
            }
        }
        public static SerializationObjectWrapper Deserialize(Stream stream)
        {
            int length;

            if (Serializer.TryReadLengthPrefix(stream, PrefixStyle.Base128, out length))
            {
                var buffer = new byte[length];
                stream.Read(buffer, 0, buffer.Length);

                using (MemoryStream ms = new MemoryStream())
                {
                    ms.Write(buffer, 0, buffer.Length);

                    ms.Position = 0;

                    SerializationObjectWrapper wrapper = Serializer.Deserialize <SerializationObjectWrapper>(ms);

                    return(wrapper);
                }
            }

            throw new ArgumentException();
        }