Promet moi de t'interesser à la serialization/deserialization![]()
Promet moi de t'interesser à la serialization/deserialization![]()
"Winter is coming" (ma nouvelle page d'accueil)
j'ai eu un TP sur la serialisation.
s'il me reste assez de temps, j'encoderais mon xml pour le protéger, j'imagine que c'est possible ... ^^
je viens de trouver un bug dans mon script de chargement xml.
je vous repasse le code :
le probleme est que les eleves recoivent l'ensemble des notes, ca ne respecte pas la structure du fichier xml.
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 public void chargement_XML(ClClasseEleve uneClasse, string unFichier) { ClMatiere uneMatiere = null; ClEleve unEleve = null; ClNote uneNote = null; ClAppreciation uneAppreciation = null; ClMatiere laMatiereNote; ClMatiere laMatiereAppr; XPathDocument doc = new XPathDocument(unFichier); XPathNavigator nav = doc.CreateNavigator(); // on cré les matières XPathNodeIterator RecMatiere = nav.Select("laClasse/lesMatieres/uneMatiere"); while (RecMatiere.MoveNext()) { string numMatiere = RecMatiere.Current.SelectSingleNode("numMatiere").Value; string libMatiere = RecMatiere.Current.SelectSingleNode("libMatiere").Value; string coeffMatiere = RecMatiere.Current.SelectSingleNode("coeffMatiere").Value; uneMatiere = new ClMatiere(Convert.ToInt32(numMatiere), libMatiere, float.Parse(coeffMatiere)); AjouteMatiere(uneMatiere); } // on cré les élèves XPathNodeIterator RecEleve = nav.Select("laClasse/lesEleves/unEleve"); while (RecEleve.MoveNext()) { string numEleve = RecEleve.Current.SelectSingleNode("numEleve").Value; string nomEleve = RecEleve.Current.SelectSingleNode("nomEleve").Value; string prenomEleve = RecEleve.Current.SelectSingleNode("prenomEleve").Value; unEleve = new ClEleve(Convert.ToInt32(numEleve), nomEleve, prenomEleve, uneClasse); AjouteEleve(unEleve); // on cré les notes XPathNodeIterator RecNote = nav.Select("laClasse/lesEleves/unEleve/uneNote");// on cré la classe while (RecNote.MoveNext()) { string numNote = RecNote.Current.SelectSingleNode("numNote").Value; string valeurNote = RecNote.Current.SelectSingleNode("valeurNote").Value; string dateNote = RecNote.Current.SelectSingleNode("dateNote").Value; string coeffNote = RecNote.Current.SelectSingleNode("coeffNote").Value; string numMatiereNote = RecNote.Current.SelectSingleNode("numMatiereNote").Value; laMatiereNote = uneClasse.GetUneMatiere(Convert.ToInt32(numMatiereNote)); uneNote = new ClNote(Convert.ToInt32(numNote), float.Parse(valeurNote), dateNote, float.Parse(coeffNote), laMatiereNote); unEleve.AjouteNote(uneNote); } // on cré les appréciations XPathNodeIterator RecAppr = nav.Select("laClasse/lesEleves/unEleve/uneAppreciation"); while (RecAppr.MoveNext()) { string numAppreciation = RecAppr.Current.SelectSingleNode("numAppreciation").Value; string libAppreciation = RecAppr.Current.SelectSingleNode("libAppreciation").Value; string numMatiereAppr = RecAppr.Current.SelectSingleNode("numMatiereAppr").Value; laMatiereAppr = uneClasse.GetUneMatiere(Convert.ToInt32(numMatiereAppr)); uneAppreciation = new ClAppreciation(Convert.ToInt32(numAppreciation), libAppreciation, laMatiereAppr); unEleve.AjouteAppreciation(uneAppreciation); } } }
imaginons que je donne à l'élève 1 deux notes : 12,5 et 16
et à l'élève 2, deux notes aussi : 5,5 et 11
l'élève 1 posséde 4 notes au final 12,5 + 16 + 5,5 + 11
de meme que l'élève 2
sauriez-vous d'où vient l'erreur ? je n'arrive pas à la trouver >_<
je suis pratiquement sur que ca vient de là !
Deserialization![]()
"Winter is coming" (ma nouvelle page d'accueil)
mais la désérialisation c'est la même chose mais en binaire non ??
non mais bon, je me suis juste planté dans un nœud à tous les coups...
je vais essayer de m'en sortir tout seul, comme un grand ^^
lol
bon, je capitule, ca fait des heures que je cherche des tutos sur le xml pour respecter la lecture des noeuds >_<
j'ai cherché partout, y compris dans les tutos et le fourm de ce site...
sauriez-vous comment réparer mon script ?
je n'ai pas encore vérifié, mais je pense qu'il y a la meme erreur au nouveau des appréciations, ce qui semblerait logique !
je vais chercher encore un peu de mon coté quand meme ...
Pas du tout. Ce que va faire la deserialisation c'est lire ton fichier xml et créer tout seul les objets et les collections.mais la désérialisation c'est la même chose mais en binaire non ??
Franchement, si tu prenais le temps de comprendre ce code tu verrais bon nombre de tes problèmes se résoudre...
Y'a un truc qui te gêne dans ce code?
Il faut savoir changer son fusil d'épaule de temps en temps et ne pas s'entêter.
A+
PS: en PJ une image des classes.
"Winter is coming" (ma nouvelle page d'accueil)
j'ai honte de le dire, mais je ne comprend pas vraiment ton code u_u
tout d'abord, je vais devoir l'apprendre, pour y intégrer les appréciations et les notes, qui sont des éléments capitaux pour les bulletins scolaires.
d'ailleurs, je l'avais posté dans un autre topic donc tu ne l'avais surement pas vu, mais voila le diagramme UML de mes classes :
et mon xml devrait, en principe, avoir une structure comme celle-ci : (puisqu'il y a les notes et appréciations)
j'ai pensé a refaire certains noeuds, notament ceux des notes et des appréciations, je pense que ca facilitera les choses...
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 <laClasse> <lesMatieres> <uneMatiere> <numMatiere>1</numMatiere> <libMatiere><![CDATA[mathématique]]></libMatiere> <coeffMatiere>7</coeffMatiere> </uneMatiere> <uneMatiere> <numMatiere>2</numMatiere> <libMatiere><![CDATA[français]]></libMatiere> <coeffMatiere>5</coeffMatiere> </uneMatiere> </lesMatieres> <lesEleves> <unEleve> <numEleve>3</numEleve> <nomEleve><![CDATA[aubry]]></nomEleve> <prenomEleve><![CDATA[max]]></prenomEleve> <lesNotes> <uneNote> <numNote>1</numNote> <valeurNote>12,5</valeurNote> <dateNote>01/05/2009</dateNote> <coeffNote>2</coeffNote> <numMatiereNote>1</numMatiereNote> </uneNote> <uneNote> <numNote>2</numNote> <valeurNote>17,25</valeurNote> <dateNote>06/05/2009</dateNote> <coeffNote>1</coeffNote> <numMatiereNote>2</numMatiereNote> </uneNote> </lesNotes> <lesAppreciations> <uneAppreciation> <numAppreciation>1</numAppreciation> <libAppreciation><![CDATA[travail convenable]]></libAppreciation> <numMatiereAppr>1</numMatiereAppr> </uneAppreciation> <uneAppreciation> <numAppreciation>2</numAppreciation> <libAppreciation><![CDATA[travail sérieux !]]></libAppreciation> <numMatiereAppr>2</numMatiereAppr> </uneAppreciation> </lesAppreciations> </unEleve> <unEleve> <numEleve>4</numEleve> <nomEleve><![CDATA[galliot]]></nomEleve> <prenomEleve><![CDATA[quentin]]></prenomEleve> <lesNotes> <uneNote> <numNote>3</numNote> <valeurNote>16,5</valeurNote> <dateNote>01/05/2009</dateNote> <coeffNote>2</coeffNote> <numMatiereNote>1</numMatiereNote> </uneNote> <uneNote> <numNote>4</numNote> <valeurNote>18</valeurNote> <dateNote>06/05/2009</dateNote> <coeffNote>1</coeffNote> <numMatiereNote>2</numMatiereNote> </uneNote> </lesNotes> <lesAppreciations> <uneAppreciation> <numAppreciation>3</numAppreciation> <libAppreciation><![CDATA[travail convenale mais peu encore mieu faire]]></libAppreciation> <numMatiereAppr>1</numMatiereAppr> </uneAppreciation> <uneAppreciation> <numAppreciation>4</numAppreciation> <libAppreciation><![CDATA[travail sérieux !]]></libAppreciation> <numMatiereAppr>2</numMatiereAppr> </uneAppreciation> </lesAppreciations> </unEleve> </lesEleves> </laClasse>
pour un élève, ses notes sont contenues dans <lesNotes></lesNotes>,
de meme pour les appréciations !
je vais tout de même relire ton code pour le comprendre, et j'essaierai ce soir![]()
j'ai essayé la sérialization, j'ai donc écrit cette méthode dans ma classe ClasseEleve :
Le code est-il correct ? va t'il vraiment retranscrire toutes mes classes comme ça ? Oo
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 public void serialization(ClClasseEleve uneClasse, string unFichier) { XmlSerializer serializer = new XmlSerializer(typeof(uneClasse)); MemoryStream mems = new System.IO.MemoryStream(); serializer.Serialize(mems, uneClasse); string _str = Encoding.UTF8.GetString(mems.ToArray()); using (FileStream stream = File.Create(@"" + unFichier)) { Byte[] data = System.Text.Encoding.UTF8.GetBytes(_str); stream.Write(data, 0, data.Length); } }
(il faut se fier à mon schema, mais dites moi si vous voulez une description textuelle de mes classes)
bon tant pis, je verais la serialization une autre fois ^^
je reprend mon code de chargement, et je pense avoir trouvé un moyen de contourner mon probleme. voila donc les modifications ke j'ai effectué sur mon xml :
je prévois d'utiliser mon noeud uneNote en fonction du numéro de l'élève à qui il appartient, de meme pour les appréciations.
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 <laClasse> <lesMatieres> <uneMatiere> <numMatiere>1</numMatiere> <libMatiere><![CDATA[mathématique]]></libMatiere> <coeffMatiere>7</coeffMatiere> </uneMatiere> <uneMatiere> <numMatiere>2</numMatiere> <libMatiere><![CDATA[français]]></libMatiere> <coeffMatiere>5</coeffMatiere> </uneMatiere> </lesMatieres> <lesEleves> <unEleve> <numEleve>3</numEleve> <nomEleve><![CDATA[XXXXX]]></nomEleve> <prenomEleve><![CDATA[XXXXX]]></prenomEleve> <lesNotes> <uneNote numEleveNote="3"> <numNote>1</numNote> <valeurNote>12,5</valeurNote> <dateNote>01/05/2009</dateNote> <coeffNote>2</coeffNote> <numMatiereNote>1</numMatiereNote> </uneNote> <uneNote numEleveNote="3"> <numNote>2</numNote> <valeurNote>17,25</valeurNote> <dateNote>06/05/2009</dateNote> <coeffNote>1</coeffNote> <numMatiereNote>2</numMatiereNote> </uneNote> </lesNotes> <lesAppreciations> <uneAppreciation numEleveAppr="3"> <numAppreciation>1</numAppreciation> <libAppreciation><![CDATA[travail convenable]]></libAppreciation> <numMatiereAppr>1</numMatiereAppr> </uneAppreciation> <uneAppreciation numEleveAppr="3"> <numAppreciation>2</numAppreciation> <libAppreciation><![CDATA[travail sérieux !]]></libAppreciation> <numMatiereAppr>2</numMatiereAppr> </uneAppreciation> </lesAppreciations> </unEleve> <unEleve> <numEleve>4</numEleve> <nomEleve><![CDATA[XXXX]]></nomEleve> <prenomEleve><![CDATA[XXXXX]]></prenomEleve> <lesNotes> <uneNote numEleveNote="4"> <numNote>3</numNote> <valeurNote>16,5</valeurNote> <dateNote>01/05/2009</dateNote> <coeffNote>2</coeffNote> <numMatiereNote>1</numMatiereNote> </uneNote> <uneNote numEleveNote="4"> <numNote>4</numNote> <valeurNote>18</valeurNote> <dateNote>06/05/2009</dateNote> <coeffNote>1</coeffNote> <numMatiereNote>2</numMatiereNote> </uneNote> <uneNote numEleveNote="4"> <numNote>5</numNote> <valeurNote>12</valeurNote> <dateNote>06/05/2009</dateNote> <coeffNote>1</coeffNote> <numMatiereNote>2</numMatiereNote> </uneNote> </lesNotes> <lesAppreciations> <uneAppreciation numEleveAppr="4"> <numAppreciation>3</numAppreciation> <libAppreciation><![CDATA[travail convenale mais peu encore mieu faire]]></libAppreciation> <numMatiereAppr>1</numMatiereAppr> </uneAppreciation> <uneAppreciation numEleveAppr="4"> <numAppreciation>4</numAppreciation> <libAppreciation><![CDATA[travail sérieux !]]></libAppreciation> <numMatiereAppr>2</numMatiereAppr> </uneAppreciation> </lesAppreciations> </unEleve> </lesEleves> </laClasse>
je cherche des infos pour selectionner un noeud et ca devrait aller ensuite.
qu'en pensez vous ?? c'est un peu la solution bricolo non ? xd
c'est bon ca marche, j'ai trouvé la solution avec SelectChild !
donc, voila mon code pour ceux que ça interesserait
merci pour toute l'aide que vous m'avez apporté !
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 public void chargement_XML(ClClasseEleve uneClasse, string unFichier) { ClMatiere uneMatiere = null; ClEleve unEleve = null; ClNote uneNote = null; ClAppreciation uneAppreciation = null; ClMatiere laMatiereNote; ClMatiere laMatiereAppr; XPathDocument doc = new XPathDocument(unFichier); XPathNavigator nav = doc.CreateNavigator(); // on cré les matières XPathNodeIterator RecMatiere = nav.Select("laClasse/lesMatieres/uneMatiere"); while (RecMatiere.MoveNext()) { string numMatiere = RecMatiere.Current.SelectSingleNode("numMatiere").Value; string libMatiere = RecMatiere.Current.SelectSingleNode("libMatiere").Value; string coeffMatiere = RecMatiere.Current.SelectSingleNode("coeffMatiere").Value; uneMatiere = new ClMatiere(Convert.ToInt32(numMatiere), libMatiere, float.Parse(coeffMatiere)); AjouteMatiere(uneMatiere); } // on cré les élèves XPathNodeIterator RecEleve = nav.Select("laClasse/lesEleves/unEleve"); while (RecEleve.MoveNext()) { string numEleve = RecEleve.Current.SelectSingleNode("numEleve").Value; string nomEleve = RecEleve.Current.SelectSingleNode("nomEleve").Value; string prenomEleve = RecEleve.Current.SelectSingleNode("prenomEleve").Value; unEleve = new ClEleve(Convert.ToInt32(numEleve), nomEleve, prenomEleve, uneClasse); AjouteEleve(unEleve); XPathNodeIterator RecLesNotes = RecEleve.Current.SelectChildren("lesNotes", ""); while (RecLesNotes.MoveNext()) { XPathNodeIterator RecNote = RecLesNotes.Current.SelectChildren("uneNote", ""); while (RecNote.MoveNext()) { string numNote = RecNote.Current.SelectSingleNode("numNote").Value; string valeurNote = RecNote.Current.SelectSingleNode("valeurNote").Value; string dateNote = RecNote.Current.SelectSingleNode("dateNote").Value; string coeffNote = RecNote.Current.SelectSingleNode("coeffNote").Value; string numMatiereNote = RecNote.Current.SelectSingleNode("numMatiereNote").Value; laMatiereNote = uneClasse.GetUneMatiere(Convert.ToInt32(numMatiereNote)); uneNote = new ClNote(Convert.ToInt32(numNote), float.Parse(valeurNote), dateNote, float.Parse(coeffNote), laMatiereNote); unEleve.AjouteNote(uneNote); } } XPathNodeIterator RecLesAppr = RecEleve.Current.SelectChildren("lesAppreciations", ""); while (RecLesAppr.MoveNext()) { XPathNodeIterator RecAppr = RecLesAppr.Current.SelectChildren("uneAppreciation", ""); while (RecAppr.MoveNext()) { string numAppreciation = RecAppr.Current.SelectSingleNode("numAppreciation").Value; string libAppreciation = RecAppr.Current.SelectSingleNode("libAppreciation").Value; string numMatiereAppr = RecAppr.Current.SelectSingleNode("numMatiereAppr").Value; laMatiereAppr = uneClasse.GetUneMatiere(Convert.ToInt32(numMatiereAppr)); uneAppreciation = new ClAppreciation(Convert.ToInt32(numAppreciation), libAppreciation, laMatiereAppr); unEleve.AjouteAppreciation(uneAppreciation); } } } }![]()
"Winter is coming" (ma nouvelle page d'accueil)
si j'ai essayé, mais à chaque essai le script plante >_<
vu le temps qu'il me reste pour boucler ce projet, je me contente de mon script actuel.
mais pour le prochain, que je compte faire en c# aussi, j'utiliserais la serialization
l'important c'est que ça fonctionne ^^
"Winter is coming" (ma nouvelle page d'accueil)
Partager