.net XmlSerializer для переопределенных свойств - PullRequest
21 голосов
/ 04 февраля 2011

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

public abstract int ID {get;set;}

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

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

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

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

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

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

Ответы [ 2 ]

37 голосов
/ 04 февраля 2011

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

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

[Serializable]
public abstract class Base
{
    [XmlIgnore]
    public abstract Int32 ID { get; set; }
}
0 голосов
/ 04 февраля 2011

Сделать свойство базового класса защищенным и неабстрактным, затем дать каждому производному классу свойство с соответствующим именем, реализованное в терминах свойства базового класса:

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

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