Archivi tag: Serializable

Problemi di deserializzazione array in c#

Un caso semplicissimo,può diventare un incubo per diverse ore…

Un xml di questo tipo:

1
2
3
4
5
6
7
8
9
10
11
<?xml version="1.0" encoding="utf-8"?>
<Applicazioni>
<Applicazione>
<NomeApplicazione>XXX1</NomeApplicazione>
<Stato>Attiva</Stato>
</Applicazione>
<Applicazione>
<NomeApplicazione>XXX2</NomeApplicazione>
<Stato>Attiva</Stato>
</Applicazione>
</Applicazioni>

L’utilizzo di una classe per deserializzare il contenuto di questo xml in un oggetto, in c# , diventa difficile a causa della natura del Root Item di questo xml, “Applicazioni”, che risulta essere un Array di “Applicazione” .

Per poter lavorare in maniera corretta con gli attributi XmlArray e XmlArrayItem, senza stare a romperci la testa, aggiungiamo un nodo contenitore ad “Applicazioni”, come nell’esempio seguente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?xml version="1.0" encoding="utf-8"?>

<ServizioStato>
<Applicazioni>
<Applicazione>
<NomeApplicazione>XXX1</NomeApplicazione>
<Stato>Attiva</Stato>
</Applicazione>
<Applicazione>
<NomeApplicazione>XXX2</NomeApplicazione>
<Stato>Attiva</Stato>
</Applicazione>
</Applicazioni>

</ServizioStato>

In questo modo possiamo andare a definire un oggetto per la deserializzazione cosi definito :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
using System;
using System.Xml.Serialization;

namespace ServizioStato
{

[Serializable()]
[XmlRoot("ServizioStato",Namespace="",IsNullable=false)]
public class ServizioStatoApplicazioni
{
private Applicazione[] applicazioni;

[XmlArray("Applicazioni")]
[XmlArrayItem("Applicazione", typeof(Applicazione))]
public Applicazione[] StatoApplicazioni
{
get { return this.applicazioni; }
set { this.applicazioni = value; }
}

}

[Serializable]
public class Applicazione
{
private string nomeApplicazioneField;
private string statoField;

[System.Xml.Serialization.XmlElementAttribute("Applicazione", Namespace="",Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
public string Applicazione
{
get { return this.nomeApplicazioneField; }
set { this.nomeApplicazioneField = value; }
}
[System.Xml.Serialization.XmlElementAttribute("Stato", Namespace="",Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
public string Stato
{
get { return this.statoField; }
set { this.statoField = value; }
}
}

Una cosa su cui riflettere è che il tool XSD per la generazione degli oggetti, non ci viene in aiuto con delle strutture definite come il primo esempio (prima dell’aggiunta del nodo ServizioStato), non riuscendo a generare le classi in maniera corretta.