You almost got it, just update your overrides by pointing to ClassB instead of ClassA :
XmlAttributeOverrides xmlOver = new XmlAttributeOverrides(); XmlAttributes xmlAttr = new XmlAttributes(); xmlAttr.XmlIgnore = true; //change this to point to ClassB property to ignore xmlOver.Add(typeof(ClassB), "ThePropertyNameToIgnore", xmlAttr); XmlSerializer ser = new XmlSerializer(typeof(ClassA), xmlOver);
A quick test if:
public class ClassA { public ClassB MyProperty { get; set; } } public class ClassB { public string ThePropertyNameToIgnore { get; set; } public string Prop2 { get; set; } }
And export method:
public static string ToXml(object obj) { XmlAttributeOverrides xmlOver = new XmlAttributeOverrides(); XmlAttributes xmlAttr = new XmlAttributes(); xmlAttr.XmlIgnore = true; xmlOver.Add(typeof(ClassB), "ThePropertyNameToIgnore", xmlAttr); XmlSerializer xs = new XmlSerializer(typeof(ClassA), xmlOver); using (MemoryStream stream = new MemoryStream()) { xs.Serialize(stream, obj); return System.Text.Encoding.UTF8.GetString(stream.ToArray()); } }
The main method:
void Main() { var classA = new ClassA { MyProperty = new ClassB { ThePropertyNameToIgnore = "Hello", Prop2 = "World!" } }; Console.WriteLine(ToXml(classA)); }
Outputs this using the parameter "ThePropertyNameToIgnore":
<?xml version="1.0"?> <ClassA xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <MyProperty> <Prop2>World!</Prop2> </MyProperty> </ClassA>
source share