使用XmlAttributeOverrides忽略不起作用的元素

时间:2017-02-04 12:11:50

标签: c# xml xmlserializer

我执行以下操作仅忽略序列化中的几个元素:

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的字符串匹配。

但是,上述内容并没有忽略该属性,它仍然是序列化的。

我错过了什么?

1 个答案:

答案 0 :(得分:1)

传递给XmlAttributeOverrides.Add(Type type, string member, XmlAttributes attributes)的类型不是成员返回的类型。它是成员声明的类型。因此,要忽略MyPropertyParent中的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