使用XmlIgnoreAttribute忽略基类属性

时间:2013-05-09 17:26:44

标签: c# .net xml serialization

我有一个抽象基类,我已经添加了一些虚拟属性。我想要的是,在我的派生类中,指定在序列化(和反序列化过程)期间忽略特定的基类属性。如下所示,Value - 类中的BaseClass - 属性被声明为virtual属性,而在DerivedClass - 类中,使用overrides - 关键字,我选择覆盖基类的ppty,然后将XmlIgnoreAttribute - 属性放在上面。但是,当我测试代码时,我仍然发现生成的XML中包含的Value ppty用于派生类实例。定义ppty也会发生同样的事情,即使我使用new关键字将它隐藏在Derived类中,它也会被渲染,然后也将XMLIgnoreAttribute应用于它。请问以下代码有什么问题?

public abstract class BaseClass
{
    public virtual String Value { get; set; }

     public String Definition { get; set; }

    [XmlAttribute("SeparatorCharacter")]
    public virtual String SeparatorCharacter { get; set; }
}


public class DerivedClass:BaseClass
{
    [XmlIgnore()]
    public overrides String Value { get; set; }

    [XmlAttribute("FillerCharacter")]
    public String FillValue { get; set; }

     [XmlIgnore()]
    public new String Definition { get; set; }
}

1 个答案:

答案 0 :(得分:6)

序列化程序不会考虑覆盖属性的属性,无论是为其提供属性还是通过XmlAttributeOverrides。获取所需行为的唯一部分解决方法是向基类添加虚拟ShouldSerializeValue方法,并在派生类中覆盖它以禁止Value的序列化。这不会阻止Value的反序列化,但您可以使覆盖设置器为空。

public abstract class BaseClass
{
    public virtual String Foo { get; set; }
    public virtual bool ShouldSerializeFoo () { return true ; }
}

public class DerivedClass:BaseClass
{
    public override String Foo { get; set; }
    public override bool ShouldSerializeFoo () { return false ; }
}