martedì 8 febbraio 2022

C# la deserializzare in .Net 5

Si riporta l'articolo scritto per il sito https://www.iprogrammatori.it/articoli/microsoft-net-framework/art_c-la-deserializzare-in-net-5-_1770.aspx  


In questo articolo vedremo come con la deserializzazione è possibile trasformare i dati presenti in un file XML in un oggetto, ossia valorizzare le proprietà di una classe con i dati situate nei vari nodi.

Prendendo spunto dall’articolo precedente sulla serializzazione degli oggetti di qualche settimana fa, come riportato in questa pagina https://www.iprogrammatori.it/articoli/microsoft-net-framework/art_c-la-serializzazione-in-net-5_1768.aspx, vedremo le operazioni inverse.

La tecnica di trasformare un file in un oggetto con i dati, può tornare utile in quei progetti di interscambio dati, o per gestire all’interno del proprio applicativo dati provenienti da altre applicazioni o per uso interno all’applicativo.

Vedremo due tecniche per deserializzare un file XML, il primo riguardante un semplice file XML, composto di un solo dati creato nel precedente articolo, come riportato in figura 1.



Figura 1 – Il file XML con i dati


Nel secondo esempio vedremo come trasformare un file XML composto da sotto nodi in un oggetto con le proprietà che sono ulteriori oggetti. Il file XML con i dati è quello rappresentato in figura 2, ed è generato nell’ultimo esempio di codice dell’articolo sulla serializzazione, del precedente sito.



Figura 2 – Il file XML generato con i sotto nodi da proprietà di classi


Creazione del progetto

Possiamo prendere il progetto creato nel precedente articolo, oppure crearne un nuovo. Nel caso che si vuole creare un nuovo progetto, nella creazione dei progetti selezionare il modello “App Windows Form” e dopo aver impostato il nome del progetto, selezionare come versione del Framework la versione 5.

Inseriamo nella form due controlli di tipo pulsante, uno avrà la proprietà “Name” impostato sul valore “BtnDeserializza” e la proprietà “Text”, con il valore “Deserializza” l’altro pulsante, avrà impostato la proprietà “Name” con il valore “BtnDeserializza2” e la proprietà “Text” con il valore “Deserializza 2”.


Terminata la creazione del progetto, non ci resta che scrivere il codice per trasformare i file XML creati in precedenza, in oggetti da utilizzare nel nostro applicativo.


Stesura del codice

Passiamo in visualizzazione codice in modo che aggiungiamo lo spazio dei nomi al progetto per la gestione dei file e della serializzazione, nel caso che si sta utilizzando il precedente progetto non occorre aggiungere nessuno spazio dei nomi, visto che sono gli stessi dei precedenti articoli.

Gli spazio dei nomi da utilizzare sono i seguenti.


using System.Xml.Serialization;

using System.IO;

using System.Xml.Linq;


Ora passiamo in visualizzazione grafica e facciamo click sul pulsante che ha il nome di “Deserializza” facciamo doppio click in modo da passare in visualizzazione codice nell’evento click del controllo button.

Nell’evento dobbiamo scrivere il codice che permette di trasformare il file XML nell’oggetto classe Anagrafica. Questa classe ha due proprietà, una nome e l’altra cognome.

Qui di seguito il frammento di codice per trasformare il file XML in un oggetto di tipo classe anagrafica, tramite il metodo “Deserialize” della classe  “XMLSerializer”.



private void BtnDeserializza_Click(object sender, EventArgs e)

        {

            XmlSerializer xmlSerializer = new XmlSerializer(typeof(Anagrafica));

            string xmlFile = File.ReadAllText("C:\\Varie\\FileXMLGenerato.xml");

            using (StringReader stringReader = new StringReader(xmlFile))

            {

                Anagrafica anagrafica = (Anagrafica)xmlSerializer.Deserialize(stringReader);

                

            }

           

        }


Si riporta a titolo informativo il codice della classe Anagrafica, nel caso che si sta utilizzando il progetto precedente, non va creata nessuna classe.

[Serializable]

    public class Anagrafica

    {

        public string Nome { get; set; }

        public string Cognome { get; set; }

 

     

    }

Per semplificare il tutorial, riportiamo qui di seguito il file XML per eseguire correttamente tale codice, per chi ha seguito l’articolo precedente, troverà il file XML generato.

<?xml version="1.0"?>

<Anagrafica xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><Nome>Emanuele</Nome><Cognome>Mattei</Cognome></Anagrafica>

Ora torniamo in visualizzazione grafica, per scrivere il codice per il secondo esempio della deserializzazione, questa volta più complesso.

Facciamo doppio click sul pulsante con la scritta “Deserializza 2” ed in visualizzazione codice nell’evento click del pulsante scriviamo il codice per effettuare deserializzare il file XML in un oggetto.

Questa volta utilizziamo una classe che ha una proprietà di tipo string ed un’altra di tipo classe, quest’ultima, una proprietà di tipo list della classe Anagrafica vista nell’esempio di codice precedente.

Anche in questo caso le classi ed il file sono quelli del precedente articolo che riportiamo a titolo informativo qui di seguito.

Qui di seguito il frammento per trasformare il file XML in una classe composta.


C#

private void BtnDeserializza2_Click(object sender, EventArgs e)

        {

            System.Xml.Serialization.XmlSerializer ser = new System.Xml.Serialization.XmlSerializer(typeof(Dati));

            string xmlFile = File.ReadAllText("C:\\Varie\\FileXMLGenerato2.xml");

            using (StringReader sr = new StringReader(xmlFile))

            {

                Dati anagrafica = (Dati)ser.Deserialize(sr);

            }

        }


Di seguito si riporta a titolo informativo la classe “Dati” che è composto da proprietà di altre classi, che è stata illustrata nell’articolo precedente.


C#

[Serializable]

   

    public class Dati  

    {

     public   string Dato { get; set; }

        public    Azienda azienda { get; set; }

    }

    [Serializable]

    public class Azienda

    {

     public   string NomeAzienda { get; set; }

 

        public List<Anagrafica> anagrafiche { get; set; }

   

    }


Mentre qui di seguito il file XML con i dati per eseguire il frammento di codice dell’evento click del pulsante per la deserializzazione .

<?xml version="1.0" encoding="UTF-8"?>

<Dati xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><azienda><NomeAzienda>Iprogrammatori</NomeAzienda><anagrafiche><Anagrafica><Nome>Emanuele</Nome><Cognome>Mattei</Cognome></Anagrafica><Anagrafica><Nome>Cristaldi</Nome><Cognome>Luigi</Cognome></Anagrafica></anagrafiche></azienda></Dati>


Ora non resta che eseguire il nostro codice e fare delle prove.


Conclusioni

L’articolo conclusivo sulla tecnica per serializzare e deserializzare per la trasformazione di classi in XML e da file XML con dati in oggetti, ha voluto fornire al lettore la tecnica della serializzazione e deserializzazione nel linguaggio di programmazione C#, che può tornare utile per l’interscambio di dati tra applicativi o sistemi diversi, oppure per la gestione di azioni e dati all’interno del proprio applicativo.

Una tecnica che si utilizza fin dalle prime versioni del Framework, ed è sempre più utilizzata nelle moderne applicazioni.

Nessun commento: