XmlSerializer e serializzazione personalizzata

Personalizzare l'XML prodotto dalla serializzazione di una classe con XmlSerialization è motlo semplice; è sufficiente infatti far implementare alle classi coinvolte nella serializzazione l'interfaccia IXmlSerializer.

Voglio mostrarvi un esempio: ho avuto la necessità di serializzare una classe che conteneva alcune liste di altre classi; il documento prodotto non doveva raggruppare le varie liste in nodi che rappresentavano le proprietà, ma elencare tutte le istanze sotto il nodo radice.

La classi di esempio:

public class InterfaceIn : IXmlSerializable { public List<Field> Fields { get; set; } public List<Constant> Constants { get; set; } ... }

XML che dovrebbe essere prodotto:

<INTERFACEIN> <CONSTANT DESTINATION="COMMIT_FLAG" VALUE="X" /> <CONSTANT DESTINATION="SAVE_FLAG" VALUE="X" /> <FIELD NAME="DOC_NUMBER" DESTINATION="DOKNR" /> <FIELD NAME="DOC_PART" DESTINATION="DOKTL" /> </INTERFACEIN>

E uno stralcio di implementazione dell'interfaccia IXmlSerailizable delle classi coinvolte:

Esempio di deserializzazione di InterfaceIn

public void ReadXml(System.Xml.XmlReader reader) { reader.Read(); while (!reader.EOF) { if (reader.IsStartElement()) { switch (reader.Name) { case "FIELD": var f = new Field(); f.ReadXml(reader); this.Fields.Add(f); break; case "CONSTANT": var c = new Constant(); c.ReadXml(reader); this.Constants.Add(c); break; } } reader.Read(); } }

Esempio di serializzazione di InterfaceIn

public void WriteXml(System.Xml.XmlWriter writer) { foreach (var f in this.Fields) f.WriteXml(writer); foreach (var c in this.Costants) c.WriteXml(writer); }

Esempio di serializzazione di Field:

public void WriteXml(System.Xml.XmlWriter writer) { writer.WriteStartElement("FIELD"); writer.WriteAttributeString("NAME", this.Name); writer.WriteAttributeString("DESTINATION", this.Destination); writer.WriteEndElement(); }

In buona sostanza è sufficiente avere un po' di dimistischezza con l'uso degli Stream, per ottenere delle serializzazioni personalizzate.

 

Matteo

 

Technorati Tag: ,,

Aprire un file col programma predefinito

Ecco un piccolo tip per aprire un file in c#, in modo del tutto analogo alla cara vecchia ShellExecute

System.Diagnostics.Process proc = new System.Diagnostics.Process(); proc.StartInfo.FileName = path; proc.StartInfo.UseShellExecute = true; proc.Start();

Non so se sia l'unico modo; sicuramente è un modo semplice ed efficace

 

Matteo

 

Technorati Tag:

SqlServer Compact 32 bit in ambiente a 64 bit

Se vi capita di usare Visual Studio 2008 su una macchina con, ad esempio, un Windows Vista a 64 bit per creare una applicazione con SqlServer Compact a 32 bit, potreste imbattervi in un errore col seguente messaggio:

...Could not load file or assembly or one of its dependencies. An attempt was made to load a program with an incorrect format...

A me è successo e ci ho messo un po a capire che era colpa della mia disattenzione.

Le soluzioni sono due:

  • la prima è che se vi serve usare il SqlCompact a 32 bit si deve fare attenzione alla piattaforma di destinazione in fase di compilazione; non va più bene AnyCPU ma va cambiata ad x86.
  • la seconda è quella di usare SqlCompact a 64 bit

 

 

Matteo

 

Technorati Tag: ,