Подтвердить что ты не робот

.net XmlSerializer при переопределенных свойствах

У меня есть базовый класс с абстрактным свойством:

public abstract int ID {get;set;}

Теперь у меня есть подкласс, который является XmlSerialized. Итак, он имеет:

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

Я не могу переместить атрибут XmlElement в baseclass, так как каждый подкласс будет иметь другое имя элемента xml.

Теперь, когда я десериализую этот класс, я получаю следующую ошибку:

Пользователь 'Subclass.ID' скрывает унаследованные член "BaseClass.ID", но имеет различные пользовательские атрибуты.

Что я могу сделать?

4b9b3361

Ответ 1

Сериализация и десериализация производных типов работает, когда переопределенные свойства имеют атрибуты [XmlElement] и [XmlAttribute], добавляя атрибут [XmlIgnore].

Базовый класс может быть сделан абстрактным, чтобы он никогда не мог быть создан и поэтому сериализован или десериализован.

[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;}
}