Freeteo


Pensieri e C#dice di Matteo Raumer

Serializzare in Xml un oggetto con proprieta TimeSpan

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.

Categoria: .net
martedì, 25 giu 2013 Ore. 09.45





  • Views Home Page: 248.544
  • Views Posts: 427.069
  • Views Gallerie: 597.113
  • n° Posts: 163
  • n° Commenti: 148
Anno 2014

Anno 2013

Anno 2012

Anno 2011

Anno 2010

Anno 2009

Anno 2008

Anno 2007

Anno 2006

Anno 2005
Copyright © 2002-2007 - Blogs 2.0
dotNetHell.it | Home Page Blogs
ASP.NET 2.0 Windows 2003