PERSONNALISER LA SERIALIZATION XML AVEC LES ATTRIBUTS

cs_mathmax Messages postés 403 Date d'inscription vendredi 28 octobre 2005 Statut Membre Dernière intervention 31 août 2008 - 25 févr. 2007 à 06:10
 Utilisateur anonyme - 2 oct. 2010 à 12:07
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/41632-personnaliser-la-serialization-xml-avec-les-attributs

Utilisateur anonyme
2 oct. 2010 à 12:07
Ha j'ai oublier de préciser que ma collection de diplome est un champ de Student ou de Person dans ton exemple.
Merci
Utilisateur anonyme
2 oct. 2010 à 12:05
Bonjour, j'utilise cette source depuis un moment, mais je n'ai pas réussi à sérialiser une classe contennant une collection d'une autre classe.
Par exemple une classe Diplomes contenant le nom du diplome, la date d'optention, la note et la mention.

Si cette collection est déclarée
[XmlArrayItem(typeof(Diplome))]
[XmlArray("Diplomes", IsNullable = true)]
List<Diplome> ça plante.

Si j'essaye de sérialiser Diplome[] là il ne se passe rien.

J'ai donc contourné le pb en sérialisant un tableau par champ:
string[] Nom
DateTime[] Date
Double[] Note
etc.

Mais c'est vite laoborieux de générer chaque tableau à partir de ma collection quand le nombre de champs s'agrandit.

Y a t il une solution?

Cdt
madebyhisto Messages postés 26 Date d'inscription mercredi 5 mars 2003 Statut Membre Dernière intervention 11 mai 2011 2
23 sept. 2008 à 17:32
Bonjour à tous, voici ma question comment on fait pour utiliser un XMLSerializer et une classe internal. Laisser de côté la réponse "Ben sa se fait pas, mais la public"; Je recherche une vrai solution même si elle consiste de recréer à bras un XMLSerializer à bras...

Merci
FREMYCOMPANY Messages postés 276 Date d'inscription jeudi 12 janvier 2006 Statut Membre Dernière intervention 22 décembre 2008
13 juil. 2007 à 14:12
Peut-être une solution pas très catholique mais bon, une propriété zOnDeSeriablize qui serait forcément sérialisée et qui donc serait settée, ce qui te permetera de savoir que l'objet a été créé par le sérialiseur et que toutes ces propriétés sont désomais prêtes...

Bon faut aussi s'assurer que cette propriété n'est pas appelée par un développeur, faudrait donc voir ce qu'il est possible de faire ou pas avec cette technique..
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
13 juil. 2007 à 13:04
Si mes souvenirs sont bons, ces events ne sont disponible que pour les serialization binaires, pas XML ! (pas d'équivalence)
benjiiim94 Messages postés 96 Date d'inscription vendredi 17 décembre 2004 Statut Membre Dernière intervention 13 juillet 2007
13 juil. 2007 à 12:43
Bonjour,

Désolé de venir après la bataille, mais j'ai une question contenant la sérialization xml.
Je n'ai pas trouvé d'équivalent à OnDeserializedAttribute, OnDeserializingAttribute et co...
Je souhaite par exemple executer une action juste après la déserialization afin de finir de préparer mon objet.
Que me conseillez vous pour cela ?

Merci beaucoup
Benjamin
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
6 mars 2007 à 18:09
Oui, SOAP = XML :-D
FREMYCOMPANY Messages postés 276 Date d'inscription jeudi 12 janvier 2006 Statut Membre Dernière intervention 22 décembre 2008
6 mars 2007 à 18:00
Soap = XML :=)

Binary = rapide, très efficace, même les champs private et les fields sont serialisés
cs_mathmax Messages postés 403 Date d'inscription vendredi 28 octobre 2005 Statut Membre Dernière intervention 31 août 2008
6 mars 2007 à 17:57
Y pas quelqu'un qui a essayé de faire une classe de sérialisation moins restrictive que XmlSerializer ? Si oui l'adresse m'intéresse...
Sinon attendons Orcas... Ca sort quand en version définitive ?
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
6 mars 2007 à 17:50
L'avantage d'un XmlSerializer c'est qu'il génère de l'xml: facilement éditable par n'importe qui. Pour pallier aux divers désavantages de ce système on peut justement passer par les attributs pour customizer un peu tout ça.

Maintenant, si les restrictions posée par le XmlSerializer sont trop grandes, on peut toujours utiliser un BinaryFormatter ou un SOAPFormatter qui sont plus complets.... mais qui génère du code binaire!

Pour ce qui est de Linq et tout ce qui est framework 3, je m'y intéresserai pas avant la sortie d'Orcas donc je ne peux pas te dire...
cs_mathmax Messages postés 403 Date d'inscription vendredi 28 octobre 2005 Statut Membre Dernière intervention 31 août 2008
6 mars 2007 à 14:08
Oui mais alors quand on a des classes comme celles là. Y a t-il un moyen pour les sérialiser/dessérialiser autre que XmlSerializer ? XLinq va t-il apporter des solutions plus efficaces pour la sérialisation de ce genre de classe. Ce qui m'embête un peu dans la sérialisation actuellement, c'est qu'on est obliger de modifier les classes pour les rendre sérialisable...
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
6 mars 2007 à 08:15
De tête, il me semble qu'il Serialize uniquement les champs étant en lecture ET écriture.
Donc selon cette hypothèse on ne pourrait jamais tomber dans le cas auquel tu fais allusions (ceci dit il faudrait vérifier, je ne suis pas tout à fait sûr)
cs_mathmax Messages postés 403 Date d'inscription vendredi 28 octobre 2005 Statut Membre Dernière intervention 31 août 2008
6 mars 2007 à 03:50
Comment fait on pour désérialiser une classe dont certaines propriétés sont en lecture seule, initialisées au moment de la construction de l'objet (grâce à un constructeur avec paramètre). On est obligé d'utiliser un faire ça "à la main" ?
FREMYCOMPANY Messages postés 276 Date d'inscription jeudi 12 janvier 2006 Statut Membre Dernière intervention 22 décembre 2008
28 févr. 2007 à 16:27
Juste une remarque sur la sérialisation de classe static (moi je fais du VB et je préfère donc Shared, question de vocabulaire). En effet, c'est impossible. D'un autre coté si il apparait nécéssaire de sérialiser une classe shared, cela reste possible... en enlevant l'attribut static. Quoi ? mais c'est pas ce que je voulais ! Oui mais l'attribut static peut être gardé quand même. Vous devez renommer votre classe SharedClass en SharedClass_DATA et lui retirer toutes les méthodes et ensuite, recréer une classe static SharedClass qui aura comme membre public Data as SharedClass_DATA et les méthodes que vous aviez retirées à SharedClass_Data. Ensuite, reste à sérialiser les données et les importer dans la classe static !
FREMYCOMPANY Messages postés 276 Date d'inscription jeudi 12 janvier 2006 Statut Membre Dernière intervention 22 décembre 2008
26 févr. 2007 à 18:14
Ah bon ? en VB pas ? Jamais essayé de le faire mais bon, qu'est-ce que ca prend comme temps de les mettres ? :)
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
26 févr. 2007 à 13:36
oui... mais uniquement en C# :)
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
26 févr. 2007 à 13:29
Ha oui tiens, j'avais jamais fait attention qu'on pouvait omettre les parenthèses...
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
26 févr. 2007 à 11:30
J'ajouterais que pour les attributs ne possèdant pas paramètre qu'il est possible d'omettre les parenthèses.

ex :
[Serializable]
public class Personne {}
FREMYCOMPANY Messages postés 276 Date d'inscription jeudi 12 janvier 2006 Statut Membre Dernière intervention 22 décembre 2008
25 févr. 2007 à 21:03
Voila, j'ai relancé mon VS 2005, et l'add-in s'appelle XsdObjectGen
FREMYCOMPANY Messages postés 276 Date d'inscription jeudi 12 janvier 2006 Statut Membre Dernière intervention 22 décembre 2008
25 févr. 2007 à 21:02
Il existe un ADD-IN à Visual Studio qui prend le problème à l'envers...

Vous faites votre flux de donnée XML "test", vous génerez, grace à VS, un fichier XSD, et l'add-in se charge, depuis le XSD, de faire une série de classes se déserialisant en un fichier XML semblable au premier.
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
25 févr. 2007 à 20:58
Héhé oui mais un constructeur static n'est pas un constructeur traditionnel, il ne permet pas de créer des objects. C'est juste une sorte de méthode qui est appelée lorsque la classe est utilisée pour la première fois.

Le XmlSerializer ne serialize pas un type mais un object, et avec une classe static on ne peut pas construire d'object puisqu'elle n'a pas vraiment de constructeur (dans le sens créateur d'object).
cs_mathmax Messages postés 403 Date d'inscription vendredi 28 octobre 2005 Statut Membre Dernière intervention 31 août 2008
25 févr. 2007 à 20:49
Si une classe static peut avoir un constructeur statique.
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
25 févr. 2007 à 20:37
Etant donné qu'une class static ne peut pas avoir de constructeur et qu'un XMLSerializer requiert un constructeur sans paramètre, la réponse est non.
cs_mathmax Messages postés 403 Date d'inscription vendredi 28 octobre 2005 Statut Membre Dernière intervention 31 août 2008
25 févr. 2007 à 19:50
Est ce qu'on peut sérialiser une classe static avec un XmlSerializer ?
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
25 févr. 2007 à 09:53
Ecrire quelques balises au-dessus de quelques classes et/ou properties, c'est l'affaire d'une ou deux minutes quand on sait quels attributs utiliser. Ecrire manuellement (avec XmlWriter ou XmlDocument), ça peut être assez pénible, tout dépend la structure des classes.

Maintenant c'est clair qu'un XmlSerializer a ses limites (on trouve quelques articles intéressants en tapant "limitation of XMLSerializer" dans google).
cs_mathmax Messages postés 403 Date d'inscription vendredi 28 octobre 2005 Statut Membre Dernière intervention 31 août 2008
25 févr. 2007 à 06:10
Merci beaucoup, je cherchais justement comment faire pour générer des noms de balises personnalisés pour les objets contenus dans des propriétés de type liste de la classe à sérialiser. J'ai ma réponse dans c'est source et même plus ! C'est vraiment génial. Merci encore :-)

Par contre placer toutes ces attributs, n'est il finalement pas plus long à écrire que d'écrire des méthodes Serialize() et Deserialize() à l'aide d'un XmlDocument et en bouclant sur toutes les propriétés que l'on souhaite personnaliser ? Un autre avantage d'utiliser XmlSerializer m'échappe peut être...
Rejoignez-nous