.net XmlSerializer on overridden properties

2020-04-01 22:22发布

I have a base class with an abstract property:

public abstract int ID {get;set;}

now, I have a subclass, which is XmlSerialized. So, it has:

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

I cannot move the XmlElement attribute to baseclass, since every subclass will have a different xml elementname.

Now, when I deserialize this class I get the following error:

Member 'Subclass.ID' hides inherited member 'BaseClass.ID', but has different custom attributes.

What can I do?

2条回答
一纸荒年 Trace。
2楼-- · 2020-04-01 22:29

Make the base class property protected and non-abstract, then give each derived class an appropriately named property implemented in terms of the base class property:

// Base class
protected int InternalID {get; set;}

// Derived class
[XmlElement]
public int SomethingID
{
  get {return InternalID;}
  set {InternalID = value;}
}
查看更多
够拽才男人
3楼-- · 2020-04-01 22:37

Serialization and deserialization of derived types works when the overridden properties have [XmlElement] and [XmlAttribute] attributes, by adding an [XmlIgnore] attribute.

The base class can be made abstract so that it can never be instantiated and therefore serialized or deserialized.

[Serializable]
public abstract class Base
{
    [XmlIgnore]
    public abstract Int32 ID { get; set; }
}
查看更多
登录 后发表回答