使用XmlIgnoreAttribute忽略基类属性

4
我有一个抽象基类,其中添加了一些虚拟属性。我想要的是,在我的派生类中,指定忽略序列化(和反序列化)过程中的特定基类属性。如下所示,在BaseClass类中,Value属性声明为虚拟属性,在DerivedClass类中,使用overrides关键字,我选择重写基类的ppty,然后在其上放置XmlIgnoreAttribute属性。但是,当我测试代码时,我发现生成的XML文件中仍包含了派生类实例的Value ppty。同样的事情也会发生在Definition 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; }
}

你的序列化/反序列化调用是什么?针对哪个类/类型信息? - user57508
1
你的 : BaseClass 呢? - user57508
@kobojunkie,你试过使用 new 而不是 overrides 吗?public new String Value { get; set; } - Steven Magana-Zook
是的,我也尝试过使用 new。但这并没有改变结果。所以我在这里尝试获取更深入的了解,以了解如何使用该属性或任何其他属性来实现我希望达到的目标。 - Kobojunkie
1个回答

6
序列化程序不会考虑覆盖属性上的属性,无论您是通过属性还是通过XmlAttributeOverrides进行提供。获取所需行为的唯一部分解决方法是在基类中添加一个虚拟的ShouldSerializeValue方法,并在派生类中重写它以禁止序列化Value。这不会阻止对Value的反序列化,但您可以使覆盖的setter为空。
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 ; }
}

请问您能否进一步解释一下这个问题?我需要让我的基类继承一个接口或者其他什么东西,才能调用这个ShouldSerializeValue方法吗? - Kobojunkie
2
不,这是一种纯粹基于命名的约定。更新后的答案。 - Anton Tykhyy
如果我的基类中有多个属性,在派生类中的返回值为false时会发生什么?那么基类中的所有属性都会被忽略吗? - Kobojunkie
2
不,每个ShouldSerialize方法都是针对一个属性的,就是它的名字所表示的那个属性。希望这次编辑能够澄清事情。 - Anton Tykhyy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接