private void Serialize(object graph, StringBuilder builder, int level) { if (graph == null) { this.AppendLine(builder, level, "NULL"); return; } var type = graph.GetType(); if (this.IsOneLine(type)) { this.AppendLine(builder, 0, graph.ToString()); } else if (typeof(IEnumerable).IsAssignableFrom(type)) { if (level > AwfulSerializer.DefaultLevel) { builder.AppendLine(); } int index = 0; foreach (var obj in (IEnumerable)graph) { Type objType; if (obj != null) { objType = obj.GetType(); } else { objType = graph.GetType().IsGenericType ? graph.GetType().GetGenericArguments().First() : typeof(void); } if (objType.Name.StartsWith("KeyValuePair`")) { var keyProp = objType.GetProperty("Key"); var valueProp = objType.GetProperty("Value"); var key = keyProp.GetValue(obj, null); var value = valueProp.GetValue(obj, null); if (this.IsOneLine(keyProp.PropertyType) && this.IsOneLine(valueProp.PropertyType)) { this.SerializeOne(builder, level, key.ToString(), value, valueProp.PropertyType); } else { this.SerializeOne(builder, level, keyProp.Name, key, keyProp.PropertyType); this.SerializeOne(builder, level, valueProp.Name, value, valueProp.PropertyType); } } else { this.SerializeOne(builder, level, index.ToString(CultureInfo.InvariantCulture), obj, objType); } index++; } } else { var properties = type.GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.GetProperty); foreach (var property in properties) { this.Append(builder, level, AwfulSerializer.GetPropertyName(property)); if (property.PropertyType == type) { this.AppendLine(builder, level, "RECURSION DETECTED!"); } else { this.Serialize(property.GetValue(graph, null), builder, level + 1); } } } }
/// <summary> /// Overrides the default awful serializer. /// </summary> /// <param name="serializer">The serializer.</param> public static void Override(AwfulSerializer serializer) { Validate.Is.Not.Null(awfulSerializer, "awfulSerializer"); Serializers.awfulSerializer = serializer; }