Freeteo


Pensieri e C#dice di Matteo Raumer

XMLSerializer e XmlAttributeOverrides per ignorare qualcosa a runtime

Potrebbe capitare come è successo a me, di trovarsi nella situazione un po' "anomala" di utilizzare l'XmlSerializer del Framework in varie parti del progetto, ma soltanto in alcune dover nascondere alcune proprietà di un'entità, il tutto quindi non possibile decorando nel sorgente la definizione delle entità stesse.
Chiaramente è sempre possibile fare la serializzazione a mano, ma con qualche attenzione, sfruttando alcuni settaggi dell'oggetto XmlSerializer è possibile fare tutto "a runtime".

Come dicevamo, nel caso volessimo nascondere i namespace xml per avere un output più "pulito", sfruttare un overload del metodo "Serialize" che permette di passare un'istanza dell'oggetto XmlSerializerNamespaces, dove aggiungere un namespace vuoto:

XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("", "");

 
Nel caso in cui volessimo omettere alcune proprietà invece, è possibile farlo usando la classe XmlAttributeOverrides, specificando il tipo di oggetto e il nome della proprietà e il fatto che venga ignorato (XmlIgnore):

private static XmlAttributeOverrides GetXMLOverride()
{
   XmlAttributeOverrides over = new XmlAttributeOverrides();
   XmlAttributes a = new XmlAttributes();
   a.XmlIgnore = true;

   //--- tolgo la visualizzazione di quello che non mi interessa
   over.Add(typeof(OggettoBase), "ID", a);
   over.Add(typeof(OggettoBase), "SysUltimaLettura", a);
   over.Add(typeof(OggettoBase), "SysUltimaModifica", a);
   ...etc...

   return over;
}

In questo caso, si voleva che nella classi di tipo "OggettoBase" le proprietà "ID,SysUltimaModifica,SysUltimaLettura" venissero omesse in fase di serializzazione.

Quindi, nel caso in cui volessimo andare a modificare qualcosa per la serializzazione anche dinamicamente, basterà aggiungere alla classe XmlAttributeOverrides quello che vogliamo, in questo caso è stata utilizzata per togliere qualcosa (XmlIgnore = true), ma chiaramente è possibile fare anche altri tipi di impostazioni, dato che l'attributo viene "associato" alla proprietà dinamicamente.

La classe XmlAttributeOverrides viene passata nel costruttore dell'XmlSerializer, mentre il namespace direttamente nel metodo Serialize, quindi, mettendo tutto insieme, risulta utile poter utilizzare un codice di questo tipo:

public static string GetXML(object oggetti, bool nascondi)
{
   string risposta = string.Empty;

   XmlAttributeOverrides
over = null;
   if(nascondi)
      over = GetXMLOverride();

  
MemoryStream ms = new MemoryStream();
  
XmlSerializer ser = new XmlSerializer(oggetti.GetType(), over);

   //--- tolgo la definizione del namespace
  
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
  
ns.Add("", "");

  
ser.Serialize(ms, oggetti, ns);
  
var m = ms.ToArray();

   risposta =
Encoding.Default.GetString(m,0,m.Length);
  
return risposta;
}

Categoria: .net
domenica, 24 giu 2012 Ore. 18.48





  • Views Home Page: 243.336
  • Views Posts: 420.737
  • Views Gallerie: 565.620
  • 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