我执行以下操作仅忽略序列化中的几个元素:
public class Parent
{
public SomeClass MyProperty {get;set;}
public List<Child> Children {get;set;}
}
public class Child
{
public SomeClass MyProperty {get;set;}
}
public class SomeClass
{
public string Name {get;set;}
}
XmlAttributes ignore = new XmlAttributes()
{
XmlIgnore = true
};
XmlAttributeOverrides overrides = new XmlAttributeOverrides();
overrides.Add(typeof(SomeClass), "MyProperty", ignore);
var xs = new XmlSerializer(typeof(MyParent), overrides);
类属性没有XmlElement
属性。属性名称也与传递给overrides.Add
的字符串匹配。
但是,上述内容并没有忽略该属性,它仍然是序列化的。
我错过了什么?
答案 0 :(得分:1)
传递给XmlAttributeOverrides.Add(Type type, string member, XmlAttributes attributes)
的类型不是成员返回的类型。它是成员声明的类型。因此,要忽略MyProperty
和Parent
中的Child
,您必须执行以下操作:
XmlAttributes ignore = new XmlAttributes()
{
XmlIgnore = true
};
XmlAttributeOverrides overrides = new XmlAttributeOverrides();
//overrides.Add(typeof(SomeClass), "MyProperty", ignore); // Does not work. MyProperty is not a member of SomeClass
overrides.Add(typeof(Parent), "MyProperty", ignore);
overrides.Add(typeof(Child), "MyProperty", ignore);
xs = new XmlSerializer(typeof(Parent), overrides);
请注意,如果构造带有覆盖的XmlSerializer
,则必须静态缓存它以避免严重的内存泄漏。有关详细信息,请参阅Memory Leak using StreamReader and XmlSerializer。
示例fiddle。