private void BuildXmlFilter(XmlFilter filter, object obj, PropertyInfo objProp) { if (obj != null) { Type type = obj.GetType(); if (type.IsArray && objProp != null) { XmlArrayItemAttribute arrayItemAttr = (XmlArrayItemAttribute)Attribute.GetCustomAttribute(objProp, typeof(XmlArrayItemAttribute)); if (arrayItemAttr != null) { filter.Elements.Add(arrayItemAttr.ElementName); } } foreach (PropertyInfo prop in type.GetProperties()) { if (ComparisonTypeMap.ComparisonTypes.Contains(prop.PropertyType)) { XmlElementAttribute elemAttr = (XmlElementAttribute)Attribute.GetCustomAttribute(prop, typeof(XmlElementAttribute)); filter.Elements.Add(elemAttr != null ? elemAttr.ElementName : prop.Name); } else if (prop.PropertyType.Assembly == Assembly.GetExecutingAssembly()) { BuildXmlFilter(filter, prop.GetValue(obj, null), prop); } } } }
public IEnumerable <String> SerializeObjectToLines(CustomizationComparison comparison, object item) { if (item != null) { using (MemoryStream stream = new MemoryStream()) { XmlWriterSettings settings = new XmlWriterSettings(); settings.OmitXmlDeclaration = true; settings.Indent = true; XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); ns.Add("", ""); XmlAttributeOverrides overrides = ComparisonTypeMap.GetComparisonTypeXmlOverrides(item.GetType()); XmlSerializer serializer = new XmlSerializer(item.GetType(), overrides); XmlFilter filter = new XmlFilter(); BuildXmlFilter(filter, item, comparison.ParentProperty); using (FilteringXmlWriter writer = new FilteringXmlWriter(XmlWriter.Create(stream, settings))) { writer.Filter = filter; serializer.Serialize(writer, item, ns); } stream.Seek(0, SeekOrigin.Begin); using (StreamReader sourceReader = new StreamReader(stream)) { string line; while ((line = sourceReader.ReadLine()) != null) { yield return(line); } } } } }