posts - 644, comments - 2003, trackbacks - 137

My Links

News

Raffaele Rialdi website

Su questo sito si trovano i miei articoli, esempi, snippet, tools, etc.

Archives

Post Categories

Image Galleries

Blogs

Links

Deserialize ... ed è subito bug

C'è un bel bug nella classe Font. Se provate a deserializzarla usando il formatter Soap otterrete una antipatica InvalidCastException mentre con il formatter binario tutto filerà liscio.

// Costruttore che deserializza della classe Font, preso con Reflector
private Font(SerializationInfo info, StreamingContext context)
{
    // ....
    SerializationInfoEnumerator enumerator1 = info.GetEnumerator();
    while (enumerator1.MoveNext())
    {
        // ... 
        if (string.Compare(enumerator1.Name, "Size", true, CultureInfo.InvariantCulture) == 0)
           {
                single1 = (float) enumerator1.Value;         // Bug! InvalidCastException
                continue;
           } 
        // ... 
    }

Il bug è dovuto al fatto che il Soap salva i tipi nativi in formato stringa (float nella fattispecie) e quando viene deserializzato, il cast provoca l'erroraccio. Avrebbero dovuto invece usare per esempio Convert.ToSingle e il gioco era fatto.

Poichè la classe Font è sealed (grrrrr) non è possibile fissare il bug derivandola e fornendo una versione corretta del costruttore.

Il workaround perciò consiste nell'usare FontConverter:
Nella serializzazione sarà necessario ottenere una stringa dalla Font:

FontConverter fc = new FontConverter();
Font myFont1 = new Font("Arial", 10.5f);
string strFont = fc.ConvertToInvariantString(myFont1);
// ... serialize strFont ...

Nella deserializzazione sarà necessario riconvertire la stringa in Font:

// ... deserialize in strFont
Font myFont2 = (Font)fc.ConvertFromInvariantString(strFont);

Microsoft ha già riconosciuto che è un bug e anche già noto (ma non ancora presente in alcun articolo pubblico) ed è stato già fissato nel framework 2.0. Nessuna previsione di fix per i Framework 1.x

Print | posted on domenica 27 marzo 2005 18:48 | Filed Under [ .NET [Italiano] ]

Comments have been closed on this topic.

Powered by:
Powered By Subtext Powered By ASP.NET