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; }
domenica, 24 giu 2012 Ore. 18.48
|
- Views Home Page: 249.050
- Views Posts: 427.796
- Views Gallerie: 604.360
- 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
|
|