static string Stringify(SerializedAggregate instance, string indent, bool skipFirst) { var builder = new StringBuilder(); builder.AppendFormat("{0}{1}{2}", NameString(instance, indent, skipFirst), TypeString(instance), Environment.NewLine); builder.AppendLine(indent + "{"); foreach (var key in instance.Children.Keys) { if (key is SerializedAtom) builder.Append(Stringify(key as SerializedAtom, indent + " ") + " "); else if (key is SerializedObject) { builder.Append(Stringify(key as SerializedObject, indent + " ")); builder.Append(indent + " "); } else builder.Append(indent + " " + key + " "); builder.Append("-> "); if (instance.Children[key] is SerializedAtom) builder.AppendLine(Stringify(instance.Children[key] as SerializedAtom, indent + " ", true)); else builder.Append(Stringify(instance.Children[key], indent + " ", true)); } builder.AppendLine(indent + "}"); return builder.ToString(); }
XElement ToXml(SerializedAggregate instance) { return(new XElement(Class, ToXmlType(instance), instance.Children .Select(child => { return new XElement(Member, child.Key is string?new XElement(KeySimple, child.Key as string) : child.Key is SerializedObject ? new XElement(KeyComposite, ToXml(child.Key as SerializedObject)) : null, ToXml(child.Value)); }) .ToArray())); }
SerializedAggregate GetAggregate(XElement src) { var type = FromXmlType(src); var members = src.Elements(Member) .Select(el => { var key = el.Elements(KeySimple).Count() == 1 ? (object)el.Element(KeySimple).Value : (object)ToObject(el.Element(KeyComposite).Elements().First()); var value = ToObject(el.Elements().ElementAt(1)); return(new KeyValuePair <object, SerializedObject>(key, value)); }) .ToList(); var result = new SerializedAggregate() { //Name = name, Type = type }; members.ForEach(member => result.Children.Add(member.Key, member.Value)); return(result); }