XML Sérialisation + héritage + dictionary

sidommou Messages postés 27 Date d'inscription vendredi 31 décembre 2004 Statut Membre Dernière intervention 29 novembre 2010 - 3 sept. 2008 à 13:41
sidommou Messages postés 27 Date d'inscription vendredi 31 décembre 2004 Statut Membre Dernière intervention 29 novembre 2010 - 8 sept. 2008 à 08:56
Salut,

J'ai besoin d'un peu d'aide pour la sérialisation XML. J'ai une classe école qui contient un objet dictionary de personne. une personne peut être un étudiant, un professeur ou encore un membre administratif.

J'ai voulu faire une sérialisation xml mais j'ai eu des problèmes sur 2 points:
1) sérialisation du dicionary: j'ai trouvé une solution mais cette dernière ne fonctionne pas quand j'intègre le dictionary dans la classe.
2) la sérialisation xmlme génére une exception lors del'ajout d'un objetfils de personne.

voila la structure du fichier xmlqueje souhaiteaboutir à:

<ecole id="" nom="">
   
         <etudiant id="" nom="" classe=""/>
         
               <classe id="" nom=""/>
               <classe id="" nom=""/>
         

         <etudiant id="" nom="" classe=""/>
   

</ecole>

Si quelq'un peut m'aider car j'en ai vraiment besoin etcurgent même
merci d'avance

14 réponses

billou_13 Messages postés 860 Date d'inscription jeudi 4 mars 2004 Statut Membre Dernière intervention 19 août 2014 29
3 sept. 2008 à 14:48
Bonjour,

Concernant ton exception lors de la génération du xml, il faut que tu déclares toutes tes classes de bases dans la classe collection.

Exemple:
[XmlInclude(typeof(Etudiant)), XmlInclude(typeof(Professeur))]
public class PersonneCollection : ICollection
{
//...
}

Perso, si quelqu'un sait, je n'ai jamais su pourquoi ? ^^


Billou
0
billou_13 Messages postés 860 Date d'inscription jeudi 4 mars 2004 Statut Membre Dernière intervention 19 août 2014 29
3 sept. 2008 à 14:50
Erratum ^^:
Pour la déclaration, ce n'est pas les classes de bases mais plutôt les classes héritant de ta classe de base "Personne".

De plus, pour les "XmlInclude", il faut que tu déclares le namespace:
using System.Xml.Serialization;

Bonne journée,


Billou_13
0
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
3 sept. 2008 à 14:54
Pour la sérialization du dictionary, je te conseille de créer une classe dérivée de dictionary<typedecle, Personne> qui implémente IXmlSerializable, et d'utiliser cette classe plutot que le dictionnaire lui même
0
billou_13 Messages postés 860 Date d'inscription jeudi 4 mars 2004 Statut Membre Dernière intervention 19 août 2014 29
3 sept. 2008 à 15:09
Perso, je n'implèmente jamais l'interface IXmlSerializable et cela fonctionne très bien.
Je m'arreterai donc à:

[XmlInclude(typeof(Etudiant)), XmlInclude(typeof(Professeur))]
public class PersonneCollection : Dictionnary<string, Personne>
{
//...
}


Billou_13
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
gglamicose Messages postés 94 Date d'inscription lundi 7 juillet 2008 Statut Membre Dernière intervention 7 mars 2009 1
3 sept. 2008 à 15:13
Salut Sidommou, j'ai un lien dans la poche qui m'as vraiment beaucoup aidé a l'époque ou j'ai du passer par la sérialisation !
http://kib2.free.fr/SerialisationCSharp.pdf

J'espère qu'il t'aideras autant que moi !
Cordialement
0
billou_13 Messages postés 860 Date d'inscription jeudi 4 mars 2004 Statut Membre Dernière intervention 19 août 2014 29
3 sept. 2008 à 15:56
Pour revenir sur l'interface IXmlSerializable, je ne l'ai utilisé qu'une fois:
lorsque que j'ai voulu influencer la création du fichier XML de sortie.

Dans ce cas, l'implémentation de l'interface permet de prendre la main sur les méthode de sérialisation et déserialisation:
public void WriteXml(XmlWriter writer);
public void ReadXml(XmlReader reader);
public XmlSchema GetSchema()


Billou_13
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
3 sept. 2008 à 17:23
Ceux qui sont abonnés au magazine Programmez! peuvent consulter mes 2 articles à ce sujet (n°109 et 110)...
0
billou_13 Messages postés 860 Date d'inscription jeudi 4 mars 2004 Statut Membre Dernière intervention 19 août 2014 29
3 sept. 2008 à 18:06
C'est considéré comme de la pub ça ^^
Résultat: je vais devoir acheter le magazine pour savoir si j'utilise la bonne méthode.

Bravo Bidou, tu a gagné un lecteur !
J'espère que ca vaut le coup que j'aille acheter le magazine. Sinon, demain, tu auras de mes nouvelles !!!

Bonne soirée,


Billou_13
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
3 sept. 2008 à 18:41
C'est un article assez léger, plutôt pour débutant, qui est déjà sorti y'a 2 mois (et sur deux numéros car trop grand). Je peux t'envoyer les sources PDF par eMail si intéressé puisqu'il n'est plus dispo en vente (le nouveau est déjà sorti)....
0
billou_13 Messages postés 860 Date d'inscription jeudi 4 mars 2004 Statut Membre Dernière intervention 19 août 2014 29
3 sept. 2008 à 18:58
Ah bein bravo ! LOL
Je viens d'acheter le numéro de ce mois-ci et comme il était sous plastique, j'ai pas pu vérifier ^^
Tu me diras, ca ne me fera pas de mal de lire un peu.

Cela étant, ton article m'intéresse fortement. Si tu peux me l'envoyer en pdf, ca serait super sympa.

Merci à toi,


Billou_13
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
3 sept. 2008 à 19:44
Arf mince sorry...
0
sidommou Messages postés 27 Date d'inscription vendredi 31 décembre 2004 Statut Membre Dernière intervention 29 novembre 2010
3 sept. 2008 à 20:41
Merci à tous,
pour le truc de dictinary, c vrai qu'il n'est pas sérialisable et j'ai trové comment implémenter un classe dérivant de xml serilzable. le pb vient dans l'ingration de cette classe dans une autre car c'est pas le même type de sérialisation. je sais pas si je me fait bien comprendre.

pour l'héritage, je viens de trouver des remarque tel que les classes filles doient avoir un constructeur dans parametre afin que la sérialisation marche. je vais essayer ça sur mon cose et je vous tien au courant.

et merci encore une fois

je suis toujours ouvert à vos propositions.
0
sidommou Messages postés 27 Date d'inscription vendredi 31 décembre 2004 Statut Membre Dernière intervention 29 novembre 2010
8 sept. 2008 à 08:35
Bonjour à tous,

J'ai trouvé une solution pour le problème de l'héritage.En fait, les balises à ajouter sont:

1) pour chaque classe, On doit ajouter le serializable et le xml type. Par exemple, pour la calsse personne, nous ajoutons:


[Serializable()]


[XmlType(TypeName =
"Personne")]

2) Lors de l'utisation de l'hériatge, nous ajoutons les références à l'utilisation de l'héritage. Par exemple, dans la classe école, nous avons dit que c un ensemble de personnes, alors au dessus de la declaration de la liste, nous devons ajouter:


[XmlArrayItem(
typeof(
Personne)),
XmlArrayItem(
typeof(
Etudiant)),
XmlArrayItem(
typeof(
Professeur)),
XmlArrayItem(
typeof(
EmpAdministratif))]


[XmlArray(
"Personnes", IsNullable =
false)]

dans la liste, nous déclarons ainsi que la liste peut contenir des éléments de type personne,etudiant, professeur ou encore empAdministratif.

Un des inconvénients c que l'onpeut pas déclarer List où Ipersonne c l'interface qu'implémente personne.D'autre part, si jedéclare par exemple un ensemble de classes sous école et que jeredéclare sous professeur, ça va générer deux objet différents lors de la désérialisation.

> Maintenant que le problème de l'héritage est partiellemnt dénoué . Il me resteà trouver une solution à l'utilisation de Dictionary. Je voudrais avoir une solution de telle sorte que le code de sérialisation etde désérialisation soit le même pour tous les objets de mon application. Alors si qlq1 peut m'aider, jene dirais pas non.

Merci d'avance
0
sidommou Messages postés 27 Date d'inscription vendredi 31 décembre 2004 Statut Membre Dernière intervention 29 novembre 2010
8 sept. 2008 à 08:56
Autre chose, j'ai pas pu sérialiser un attribut de type object.Y aurait pas une solution pour contourner ce problème carj'en ai besoin pour l'initialisation de mes objets.


Merci
0
Rejoignez-nous