E' tempo di PDC

Ed eccoci (quasi) pronti a partire: terminate e consegnate (non vedevo l'ora!) all'editore le slide relative alle mie sessioni WPC (a proposito: venite a trovarci al booth UGI!), preparata la valigia, è tempo di impacchettare il necessaire del perfetto turista IT: notebook, fotocamera, PDA e gingilli vari. Domani mattina si parte presto (h 6:40), destinazione Londra, dove incontrerò Raffaele, Gianluca e Marco. Da lì, rotta diretta verso Los Angeles (con volo charter made-in-Microsoft!), dove anche Corrado sarà dei nostri. Un bel gruppetto, non credete? Ragazzi... meno male che è arrivata PDC: tra le altre cose, questo significa (come giustamente ha anticipato Corrado) che finalmente si potrà iniziare a parlare pubblicamente di Whidbey (nei limiti di quanto mostrato alla conf, ovviamente...): credetemi, ne vale proprio la pena perchè... Ops! Dovete avere ancora un paio di giorni di pazienza :-p Stay tuned!

E' una FAQ? E' un tip? E' un pattern? Ai "poster" l'ardua sentenza (però risolve un problema)

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

«ottobre»
domlunmarmergiovensab
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678