【问题标题】:.net XmlSerializer on overridden properties.net XmlSerializer 上覆盖的属性
【发布时间】:2011-06-21 08:32:06
【问题描述】:

我有一个带有抽象属性的基类:

public abstract int ID {get;set;}

现在,我有一个子类,它是 XmlSerialized。所以,它有:

[XmlElement("something")]
public override int ID {
get { //... }
set { //... }
}

我无法将 XmlElement 属性移动到基类,因为每个子类都有不同的 xml 元素名。

现在,当我反序列化此类时,出现以下错误:

成员 'Subclass.ID' 隐藏继承 成员“BaseClass.ID”,但有 不同的自定义属性。

我能做什么?

【问题讨论】:

  • 考虑在属性声明中使用'new'关键字,这可能会解决您的问题。

标签: c# .net attributes xml-serialization overriding


【解决方案1】:

通过添加[XmlIgnore] 属性,当覆盖的属性具有[XmlElement][XmlAttribute] 属性时,派生类型的序列化和反序列化工作。

基类可以被抽象化,这样它就不能被实例化,因此不能被序列化或反序列化。

[Serializable]
public abstract class Base
{
    [XmlIgnore]
    public abstract Int32 ID { get; set; }
}

【讨论】:

    【解决方案2】:

    使基类属性受保护且非抽象,然后为每个派生类赋予一个根据基类属性实现的适当命名的属性:

    // Base class
    protected int InternalID {get; set;}
    
    // Derived class
    [XmlElement]
    public int SomethingID
    {
      get {return InternalID;}
      set {InternalID = value;}
    }
    

    【讨论】:

    • 但是基类需要实现一个接口......这就是它有一个 ID 属性的全部原因。
    猜你喜欢
    • 2019-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-03
    • 1970-01-01
    • 2013-07-19
    • 1970-01-01
    相关资源
    最近更新 更多