Sicuramente molti di noi hanno giocato e tratto profitto dal supporto alla serializzazione offerto dal framework .NET; oggi, però, mi sono imbattuto in un caso interessante. Dovevo, infatti, estendere la classe Hashtable (che di per sè è già serializzabile), e rendere la mia classe serializzabile. Ora, poichè l'attributo Serializable non viene ereditato (per ottimi motivi, direi...) ho semplicemente decorato anche la mia classe con tale attributo:
[Serializable]
public class ExtendedHashtable : System.Collections.Hashtable
{
[NonSerialized]
private CampoDocumento campoDocumento=null;
public Hashtable(CampoDocumento campoTarget) : base()
{
this.campoDocumento=campoTarget;
}
//Varie proprietà e metodi
}
Come mi aspettavo, la classe ExtendedHashtable è risultata serializzabile senza alcun problema, ma... Ogni tentativo di deserializzazione generava una eccezione contraddistina dal messaggio: "The constructor to deserialize an object of type ExtendedHashtable was not found.". Perchè? Perchè la classe base (Hastable), per quanto serializzabile, lo è mediante un meccanismo "custom", ossia implementa l'interfaccia ISerializable. Questo significa che si aspetta di poter utilizzare, in fase di deserializzazione, un apposito costruttore, la cui firma è:
public Hashtable(SerializationInfo info, StreamingContext context);
In pratica, per risolvere il nostro "problema" basterà aggiungere alla nostra classe questo costruttore e richiamare quello corrispondente nella classe base:
[Serializable]
public class ExtendedHashtable : System.Collections.Hashtable
{
[NonSerialized]
private CampoDocumento campoDocumento=null;
public Hashtable(SerializationInfo info, StreamingContext context) : base(info, context)
{
}
public Hashtable(CampoDocumento campoTarget) : base()
{
this.campoDocumento=campoTarget;
}
//Varie proprietà e metodi
}
Come diceva la pubblicità? "Basta poco, che c'è vo'!"... :-D