コード例 #1
0
        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);
                    }
                }
            }
        }
コード例 #2
0
 /// <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;
 }