2011-02-04 2 views
17

ho una classe di base con una proprietà astratta:.net XmlSerializer sulle proprietà override

public abstract int ID {get;set;} 

ora, ho una sottoclasse, che è XmlSerialized. Quindi, ha:

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

Non riesco a muovere l'attributo XmlElement per baseclass, dal momento che ogni sottoclasse avrà un diverso ElementName xml.

Ora, quando deserializzare questa classe ottengo il seguente errore:

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

Cosa posso fare?

+0

Considerare l'utilizzo della parola chiave 'nuova' nella dichiarazione di proprietà, che potrebbe risolvere il problema. –

risposta

29

serializzazione e deserializzazione di tipi derivati ​​funziona quando l'override proprietà hanno attributi [XmlElement] e [XmlAttribute], aggiungendo un attributo [XmlIgnore].

La classe base può essere resa astratta in modo che non possa mai essere istanziata e quindi serializzata o deserializzata.

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

rendono la proprietà classe base protetta e non astratta, quindi dare ad ogni classe derivata una proprietà nome appropriato implementato in termini di proprietà classe base:

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

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

Ma la classe base deve implementare un'interfaccia ... Questo è il motivo per cui ha una proprietà ID. – TDaver