3

我有一个抽象基类,向其中添加了一些虚拟属性。我想要的是,在我的派生类中,指定在序列化(和反序列化过程)期间忽略特定的基类属性。正如您在下面看到的,-class 中的Value-propertyBaseClass被声明为virtual属性,并且在DerivedClass-class 中,使用overrides-keyword,我选择覆盖基类的 ppty,然后将 -Attribute 放在XmlIgnoreAttribute它上面。但是,当我测试代码时,我仍然发现Valueppty 包含在为我的派生类实例生成的 XML 中。定义 ppty 也会发生同样的事情,即使我使用 new 关键字将它隐藏在派生类中,它也会被渲染,然后也将 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; }
}
4

1 回答 1

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 ; }
}
于 2013-05-09T17:49:31.793 回答