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