Bonjour à tous,
Je débute en C# et j'ai bien besoin de votre aide. Il me semble que je passe à côté de quelque chose dans le fonctionnement d'une deserialization. J'essaie de concevoir un petit programme avec un objet Classe à sauvegarder, contenant des Eleve avec eux-mêmes un objet Competences, elle même construite avec plusieurs instances de la classe Competence sous forme d'une List<>.
Mais quand l'objet est instancié à partir d'une deserialization xml, la construction de la liste Competence se déclenche deux fois et l'ajout des compétences dans la liste se reproduit. Et j'aimerais éviter cette liste infinie de compétences redondantes en remplaçant la liste existante lors de la sauvegarde. Il me semble comprendre que le .Add est un problème mais je n'arrive pas à le contourner. J'ai essayé un Clear() en amont, ou de conditionner au nombre d'élément dans la liste, mais je n'obtiens qu'un tout ou rien. Je ne parviens pas non plus à remplacer plutôt qu'ajouter car la liste est considérée comme inexistante lors de la conception de la classe Competences.
Un bout de code sera sûrement plus clair :
Le point de départ
La classe Classe
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 XmlSerializer xs = new XmlSerializer(typeof(Dt_Classes.Classe)); using (StreamReader rd = new StreamReader(dossierGestion + '\\' + laCbBox.SelectedItem.ToString() + ".xml")) { uneClasse = xs.Deserialize(rd) as Dt_Classes.Classe; RefreshDataGrid(dgvLoad); }
La classe Eleve
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 public class Classe { private string _nomClasse; private List<Eleve> _lesEleves = new List<Eleve>(); private List<Ilot> _lesIlots = new List<Ilot>(); public string NomClasse { get { return _nomClasse; } set { _nomClasse = value; } } public List<Eleve> LesEleves { get { return _lesEleves; } set { _lesEleves = value; } } public Ilot[] LesIlots = new Ilot[8]; public Classe() { NomClasse = _nomClasse; LesEleves = _lesEleves; for (int i = 1; i<=LesIlots.Length-1; i++) { LesIlots[i] = new Ilot(); LesIlots[i].NomIlot = i; } } public void IntegrerIlot(Eleve eleve, int ilot) { LesEleves.Remove(eleve); LesIlots[ilot].ElevesIlots.Add(eleve); } public void QuitterIlot(Eleve eleve, int ilot) { LesIlots[ilot].ElevesIlots.Remove(eleve); LesEleves.Add(eleve); } }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
42
43
44
45
46
47
48
49
50
51
52
53 public class Eleve { private string nomEleve; private string prenomEleve; private float ilot; private double _pointsOral; private Competences _sesCompetences = new Competences(); [DisplayName("Nom")] public string Nom { get { return nomEleve; } set { nomEleve = value; } } [DisplayName("Prénom")] public string PrenomEleve { get { return prenomEleve; } set { prenomEleve = value; } } public float Ilot { get { return ilot; } set { ilot = value; } } public double PointsOral { get { return _pointsOral; } set { _pointsOral = value; } } public Competences SesCompetences { get { return _sesCompetences; } set { _sesCompetences = value; } } public Eleve() { Nom = nomEleve; PrenomEleve = prenomEleve; Ilot = ilot; PointsOral = _pointsOral; SesCompetences = _sesCompetences; } private void GagnePoints(double points) { _pointsOral += points; } public override string ToString() { return String.Format("Nom: {0} \n Prénom : {1} \n Points à l'oral : {2}", Nom, PrenomEleve, PointsOral); } }
Et la classe Competences
Le résultat problématique lors de la sauvegarde
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
42
43
44
45
46
47
48 public class Competences { List<string> NomCompetencesOral = new List<string>(); List<string> DomaineCompetencesOral = new List<string>(); List<string> NomCompetencesComprehension = new List<string>(); List<string> DomaineCompetencesComprehension = new List<string>(); List<string> NomCompetencesEcriture = new List<string>(); List<string> DomaineCompetencesEcriture = new List<string>(); List<string> NomCompetencesLangue = new List<string>(); List<string> DomaineCompetencesLangue = new List<string>(); public List<Competence> CompetencesOral = new List<Competence>(); public List<Competence> CompetencesComprehension = new List<Competence>(); public List<Competence> CompetencesEcriture = new List<Competence>(); public List<Competence> CompetencesLangue = new List<Competence>(); public Competences() { // Initialisation des compétences du programme NomCompetencesOral.Add("Ecouter en maintenant son attention sur une période définie"); DomaineCompetencesOral.Add("D1.1"); NomCompetencesOral.Add("Écouter pour comprendre un message oral, un propos, un discours, un texte lu."); DomaineCompetencesOral.Add("D1.1"); NomCompetencesOral.Add("Adopter une attitude critique par rapport à son auditoire."); DomaineCompetencesOral.Add("D2"); NomCompetencesOral.Add("Enoncer un texte de mémoire."); DomaineCompetencesOral.Add("D1.1"); NomCompetencesOral.Add("Parler en prenant en compte son auditoire."); DomaineCompetencesOral.Add("D3"); NomCompetencesOral.Add("Participer à des échanges dans des situations diversifiées."); DomaineCompetencesOral.Add("D3"); NomCompetencesOral.Add("Raconter une histoire."); DomaineCompetencesOral.Add("D1.1"); for (int i =0; i<=NomCompetencesOral.Count-1; i++) { CompetencesOral.Add(new Competence()); CompetencesOral[i].Name = NomCompetencesOral[i]; CompetencesOral[i].Domaine = DomaineCompetencesOral[i]; CompetencesOral[i].Points = 0; }
Je vous remercie de votre lecture et suis preneur de tout commentaire pour m'aider à progresser.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95 <?xml version="1.0" encoding="utf-8"?> <Classe xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <LesIlots> <Ilot xsi:nil="true" /> <Ilot> <ElevesIlots /> <NomIlot>1</NomIlot> <PointsIlot>0</PointsIlot> </Ilot> [...] </LesIlots> <NomClasse>4eD</NomClasse> <LesEleves> <Eleve> <Nom>Machin</Nom> <PrenomEleve>Trucmuche</PrenomEleve> <Ilot>0</Ilot> <PointsOral>0</PointsOral> <SesCompetences> <CompetencesOral> <Competence> <Name>Ecouter en maintenant son attention sur une période définie</Name> <Domaine>D1.1</Domaine> <Points>0</Points> </Competence> <Competence> <Name>Écouter pour comprendre un message oral, un propos, un discours, un texte lu.</Name> <Domaine>D1.1</Domaine> <Points>0</Points> </Competence> <Competence> <Name>Adopter une attitude critique par rapport à son auditoire.</Name> <Domaine>D2</Domaine> <Points>0</Points> </Competence> <Competence> <Name>Enoncer un texte de mémoire.</Name> <Domaine>D1.1</Domaine> <Points>0</Points> </Competence> <Competence> <Name>Parler en prenant en compte son auditoire.</Name> <Domaine>D3</Domaine> <Points>0</Points> </Competence> <Competence> <Name>Participer à des échanges dans des situations diversifiées.</Name> <Domaine>D3</Domaine> <Points>0</Points> </Competence> <Competence> <Name>Raconter une histoire.</Name> <Domaine>D1.1</Domaine> <Points>0</Points> </Competence> // Le doublon qui se produit en boucle ici <Competence> <Name>Ecouter en maintenant son attention sur une période définie</Name> <Domaine>D1.1</Domaine> <Points>0</Points> </Competence> <Competence> <Name>Écouter pour comprendre un message oral, un propos, un discours, un texte lu.</Name> <Domaine>D1.1</Domaine> <Points>0</Points> </Competence> <Competence> <Name>Adopter une attitude critique par rapport à son auditoire.</Name> <Domaine>D2</Domaine> <Points>0</Points> </Competence> <Competence> <Name>Enoncer un texte de mémoire.</Name> <Domaine>D1.1</Domaine> <Points>0</Points> </Competence> <Competence> <Name>Parler en prenant en compte son auditoire.</Name> <Domaine>D3</Domaine> <Points>0</Points> </Competence> <Competence> <Name>Participer à des échanges dans des situations diversifiées.</Name> <Domaine>D3</Domaine> <Points>0</Points> </Competence> <Competence> <Name>Raconter une histoire.</Name> <Domaine>D1.1</Domaine> <Points>0</Points> </Competence> [...] </Eleve> </LesEleves> </Classe>
Partager