XmlSerializer perché no?

Oggi mi è capitata una cosa curiosa. Stavo lavorando sul mio “solito” database xml nativo ( ormai sono quasi 7 anni che ci “combatto”) e un mio collaboratore mi mostra un pezzo di codice che salva la entity Customer creandola con XmlDocument. Chiunque abbia messo mani sul formato xml ha dovuto fare i conti con questa classe. Mi spiego meglio, salvare la classe creando “a mano“ tutte le proprietà (document.CreateElement, document.CreateAttribute ecc) per poi fare il contrario recuperandola. Mi sa tanto di serializzazione dico io. Così ho scritto una classe di serializzazione e deserializzazione che fa lo stesso lavoro ma per qualsiasi entità.

   1: public static class StoringState<T>
   2:     {
   3:         public static string SerializeObject(object pObject)
   4:         {
   5:             
   6:                 var xmlSerializer = new XmlSerializer(typeof(T));
   7:  
   8:                 using (var stringWriter = new StringWriter())
   9:                 {
  10:                     xmlSerializer.Serialize(stringWriter, pObject);
  11:                     return stringWriter.ToString();
  12:                 }
  13:             
  14:         }
  15:  
  16:         public static object DeserializeObject(string pXmlizedString)
  17:         {
  18:             
  19:                 var xmlSerializer = new XmlSerializer(typeof(T));
  20:  
  21:                 using (var stringReader = new StringReader(pXmlizedString))
  22:                     return (T)xmlSerializer.Deserialize(stringReader);
  23:             
  24:         }
  25:     }

Spesso i tempi stretti e la pigrizia ci impediscono di studiare meglio il nostro amato Framework e che dire XmlSerializer c’è dalla versione 2.0.

S.

Attraversare ricorsivamente un grafo di oggetti

Spesso mi capita di dover attraversare ricorsivamente un grafo di oggetti, pensate a delle folder che hanno all’interno delle altre folder che hanno all’interno delle altre folder e via così.. Mi sono chiesto è possibile creare un Extension Method che faccia questo lavoro e in base ad una condizione mi restituisca, ad esempio, la folder con un nome o un id voluto ?

   1: public static class FindRecorsive
   2:     {
   3:         public static IEnumerable<T> Traverse<T>(this IEnumerable<T> source, Func<T, IEnumerable<T>> fnRecurse)
   4:         {
   5:             foreach (T item in source)
   6:             {
   7:                 yield return item;
   8:  
   9:                 var seqRecurse = fnRecurse(item);
  10:  
  11:                 if (seqRecurse != null)
  12:                     foreach (T itemRecurse in Traverse(seqRecurse, fnRecurse))
  13:                         yield return itemRecurse;
  14:             }
  15:         }
  16:     }

Bene ora è semplice utilizzare questo Extension Method per raggiungere il nostro scopo

Entità

   1: public class Item
   2:     {
   3:         public int Id { get; set; }
   4:         public List<Item> Items { get; set; }
   5:     }

Utilizzo

   1: var find = items.Traverse(item => item.Items).FirstOrDefault(i => i.Id == 100);

Sonny