public override Task WriteToStreamAsync(System.Type type, object value, Stream writeStream, System.Net.Http.HttpContent content, System.Net.TransportContext transportContext)
        {
            RelationAggregator aggregator;

            lock (this.RelationAggregators)
            {
                if (this.RelationAggregators.ContainsKey(writeStream))
                {
                    aggregator = this.RelationAggregators[writeStream];
                }
                else
                {
                    aggregator = new RelationAggregator();
                    this.RelationAggregators[writeStream] = aggregator;
                }
            }

            var            contentHeaders    = content == null ? null : content.Headers;
            var            effectiveEncoding = SelectCharacterEncoding(contentHeaders);
            JsonWriter     writer            = this.CreateJsonWriter(typeof(object), writeStream, effectiveEncoding);
            JsonSerializer serializer        = this.CreateJsonSerializer();

            if (_errorSerializer.CanSerialize(type))
            {
                // `value` is an error
                _errorSerializer.SerializeError(value, writeStream, writer, serializer);
            }
            else
            {
                Type valtype = GetSingleType(value.GetType());
                if (_modelManager.IsSerializedAsMany(value.GetType()))
                {
                    aggregator.AddPrimary(valtype, (IEnumerable <object>)value);
                }
                else
                {
                    aggregator.AddPrimary(valtype, value);
                }

                //writer.Formatting = Formatting.Indented;

                var root = _modelManager.GetJsonKeyForType(type);

                writer.WriteStartObject();
                writer.WritePropertyName(root);
                if (_modelManager.IsSerializedAsMany(value.GetType()))
                {
                    this.SerializeMany(value, writeStream, writer, serializer, aggregator);
                }
                else
                {
                    this.Serialize(value, writeStream, writer, serializer, aggregator);
                }

                // Include links from aggregator
                SerializeLinkedResources(writeStream, writer, serializer, aggregator);

                writer.WriteEndObject();
            }
            writer.Flush();

            lock (this.RelationAggregators)
            {
                this.RelationAggregators.Remove(writeStream);
            }

            //return base.WriteToStreamAsync(type, obj as object, writeStream, content, transportContext);

            //TODO: For now we won't worry about optimizing this down into smaller async parts, we'll just do it all synchronous. So...
            // Just return a completed task... from http://stackoverflow.com/a/17527551/489116
            var tcs = new TaskCompletionSource <object>();

            tcs.SetResult(null);
            return(tcs.Task);
        }