.net XmlSerializer при переопределенных свойствах
У меня есть базовый класс с абстрактным свойством:
public abstract int ID {get;set;}
Теперь у меня есть подкласс, который является XmlSerialized. Итак, он имеет:
[XmlElement("something")]
public override int ID {
get { //... }
set { //... }
}
Я не могу переместить атрибут XmlElement в baseclass, так как каждый подкласс будет иметь другое имя элемента xml.
Теперь, когда я десериализую этот класс, я получаю следующую ошибку:
Пользователь 'Subclass.ID' скрывает унаследованные член "BaseClass.ID", но имеет различные пользовательские атрибуты.
Что я могу сделать?
Ответы
Ответ 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;}
}