In molti applicativi mi capita spesso di usare la serializzazione xml degli oggetti, in .net è veramente comoda per svariate situazioni.
L'operazione viene svolta egregiamente dal Framework, quasi sempre senza la minima preoccupazione, anche se in qualche caso, si deve fare qualche piccolo accorgimento.
Ad esempio quando abbiamo una proprietà di tipo "TimeSpan" nel nostro oggetto, la serializzazione da qualche fastidio, supponiamo infatti di avere un oggetto "Oggetto" che ha una proprietà "Impiegato" dove si salva il TempoTrascorso, qualcosa di questo genere:
public class Oggetto
{
public int ID { get; set; }
public string Descrizione { get; set; }
public DateTime Data { get; set; }
public TimeSpan Impiegato { get; set; }
}
Usando un codice "standard" sembra che vada tutto bene (non ci sono errori a runtime):
public static string Serializza(object items)
{
XmlSerializer ser = new XmlSerializer(items.GetType());
//--- serializzo in memoria per tornare la stringa
MemoryStream ms = new MemoryStream();
ser.Serialize(ms, items);
return Encoding.Default.GetString(ms.ToArray());
}
Ma già dalla stringa xml che torna mi accorgo che la proprietà "Impiegato" è a zero sempre, anche se a codice avevo dei valori:
ed infatti se poi andiamo a deserializzare questo ci troviamo con gli oggetti senza il valore di TimeSpan:
A questo punto non abbiamo errori di Serializzazione/Deserializzazione, ma di fatto abbiamo un problema di persistenza del dato, che viene perso.
La soluzione più semplice dato che a quanto pare la serializzazione Xml del Framework e il TimeSpan non vanno molto d'accordo, è passare per un tipo di dato più semplice, ad esempio la stringa, aggiungendo un'ulteriore proprietà, che nel get/set va ad operare sul TimeSpan:
...
public TimeSpan Impiegato { get; set; }
public string ImpiegatoXML
{
get { return XmlConvert.ToString(Impiegato); }
set { Impiegato = XmlConvert.ToTimeSpan(value); }
}
...
A questo punto la cosa è risolta, ossia possiamo serializzare/deserializzare in Xml senza problemi:
Anche se è sicuramente seccante avere una proprietà d'appoggio inutile di fatto alla logica applicativa, nel caso ci troviamo nella situazione di serializzare in Xml diventa un trucco molto comodo.