/// <summary>
        /// Writes the JSON representation of the object.
        /// </summary>
        /// <param name="writer">The <see cref="T:Newtonsoft.Json.JsonWriter"/> to write to.</param><param name="value">The value.</param><param name="serializer">The calling serializer.</param>
        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            InfoAccumulator info = value as InfoAccumulator;;

            writer.WriteStartObject();
            writer.WritePropertyName("errors");
            serializer.Serialize(writer, info.GetErrors());
            writer.WritePropertyName("warnings");
            serializer.Serialize(writer, info.GetWarning());
            writer.WritePropertyName("infos");
            serializer.Serialize(writer, info.GetInfo());
            writer.WritePropertyName("exceptions");
            serializer.Serialize(writer, info.GetExceptions());
            writer.WriteEndObject();
        }
        /// <summary>
        /// Reads the JSON representation of the object.
        /// </summary>
        /// <param name="reader">The <see cref="T:Newtonsoft.Json.JsonReader"/> to read from.</param><param name="objectType">Type of the object.</param><param name="existingValue">The existing value of object being read.</param><param name="serializer">The calling serializer.</param>
        /// <returns>
        /// The object value.
        /// </returns>
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            InfoAccumulator info = Activator.CreateInstance(objectType) as InfoAccumulator;

            string currentSection = null;

            while (reader.Read())
            {
                if (reader.TokenType == JsonToken.EndObject)
                {
                    break;
                }

                if (reader.ValueType == typeof(string))
                {
                    string curValue = (string)reader.Value;
                    if (curValue == currentSection)
                    {
                        currentSection = "";
                    }
                    else
                    {
                        currentSection = (string)reader.Value;
                    }
                    continue;
                }

                switch (currentSection)
                {
                case "errors":
                    var errors = (IEnumerable <string>)serializer.Deserialize(reader, typeof(IEnumerable <string>));
                    foreach (var error in errors)
                    {
                        info.AddError(error);
                    }
                    break;

                case "warnings":
                    var warnings = (IEnumerable <string>)serializer.Deserialize(reader, typeof(IEnumerable <string>));
                    foreach (var warning in warnings)
                    {
                        info.AddWarning(warning);
                    }
                    break;

                case "infos":
                    var infos = (IEnumerable <string>)serializer.Deserialize(reader, typeof(IEnumerable <string>));
                    foreach (var inf in infos)
                    {
                        info.AddInfo(inf);
                    }
                    break;

                case "exceptions":
                    var exceptions = (IEnumerable <Exception>)serializer.Deserialize(reader, typeof(IEnumerable <Exception>));
                    foreach (var exception in exceptions)
                    {
                        info.AddException(exception);
                    }
                    break;
                }
            }

            return(info);
        }