/// <summary>
        /// Asynchronously deserializes an object of the specified type.
        /// </summary>
        /// <param name="type">The type of the object to deserialize.</param>
        /// <param name="readStream">The <see cref="T:System.IO.Stream" /> to read.</param>
        /// <param name="content">The <see cref="T:System.Net.Http.HttpContent" />, if available. It may be null.</param>
        /// <param name="formatterLogger">The <see cref="T:System.Net.Http.Formatting.IFormatterLogger" /> to log events to.</param>
        /// <returns>
        /// A <see cref="T:System.Threading.Tasks.Task" /> whose result will be an object of the given type.
        /// </returns>
        public override async Task <object> ReadFromStreamAsync(Type type, Stream readStream, System.Net.Http.HttpContent content, IFormatterLogger formatterLogger)
        {
            var encoding      = new UTF8Encoding(false, true);
            var serialiser    = new JavaScriptSerializer();
            var jsonConverter = new HyperJsonConverter(new[] { type });

            serialiser.RegisterConverters(new[] { jsonConverter });
            using (var streamReader = new StreamReader(readStream, encoding))
            {
                var data = await streamReader.ReadToEndAsync();

                return(serialiser.Deserialize(data, type));
            }
        }
        /// <summary>
        /// Asynchronously writes an object of the specified type.
        /// </summary>
        /// <param name="type">The type of the object to write.</param>
        /// <param name="value">The object value to write.  It may be null.</param>
        /// <param name="writeStream">The <see cref="T:System.IO.Stream" /> to which to write.</param>
        /// <param name="content">The <see cref="T:System.Net.Http.HttpContent" /> if available. It may be null.</param>
        /// <param name="transportContext">The <see cref="T:System.Net.TransportContext" /> if available. It may be null.</param>
        /// <returns>
        /// A <see cref="T:System.Threading.Tasks.Task" /> that will perform the write.
        /// </returns>
        public override Task WriteToStreamAsync(Type type, object value, Stream writeStream, System.Net.Http.HttpContent content, TransportContext transportContext)
        {
            var task = Task.Factory.StartNew(
                () =>
            {
                var encoding      = new UTF8Encoding(false, true);
                var serialiser    = new JavaScriptSerializer();
                var jsonConverter = new HyperJsonConverter(new[] { type });
                serialiser.RegisterConverters(new[] { jsonConverter });
                using (var streamWriter = new StreamWriter(writeStream, encoding, 512, true))
                {
                    var data = serialiser.Serialize(value);
                    streamWriter.Write(data);
                    streamWriter.Flush();
                }
            });

            return(task);
        }