Mi capita spesso di utilizzare la
serializzazione per persistere dei dati su file xml.
Di solito utilizzo una classe che implementa due metodi di serializzazione e deserializzazione per evitare passaggi ripetitivi.
Il primo è abbastanza banale:
///
<summary>
///
Serializza una classe su file
///
</summary>
public
static
void
XmlSerialize(string
FileName, object
obj)
{
XmlSerializer
dser = new
XmlSerializer(obj.GetType());
using
(TextWriter
stream = new
StreamWriter(FileName))
{
dser.Serialize(stream, obj);
}
}
La cosa che invece vorrei sottoporre alla vostra attenzione è la procedura di deserializzazione, in cui ho utilizzato i generics per definire il tipo di oggetto da deserializzare.
///
<summary>
///
Deserializza un file
///
</summary>
public
static
T XmlDeserialize<T>(string
FilePath)
{
if
(!File.Exists(FilePath))
{
throw
new
FileNotFoundException("File
da deserializzare non trovato",
FilePath);
}
//Serializer
XmlSerializer
dser = new
XmlSerializer(typeof(T));
using
(TextReader
sr = new
StreamReader(FilePath))
{
//Deserializza
return
(T)dser.Deserialize(sr);
}
}
Così facendo quando voglio richiamare il metodo mi basterà scrivere:
ClasseProva
objProva = Serialization.XmlDeserialize<ClasseProva>(@"d:\prova.xml");
mentre se non avessi sfruttato i generics l'unica alternativa sarebbe stata passare il tipo dell'oggetto come parametro:
public
static
object
XmlDeserialize(string
FilePath, Type
t)
per poi richiamarlo così:
ClasseProva
objProva = (ClasseProva) Serialization.XmlDeserialize(@"d:\prova.xml",
typeof(ClasseProva));
Non so voi, ma io ritengo che dal punto di vista "stilistico" la soluzione fatta con i generics sia decisamente migliore.