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és26Date d'inscriptionmercredi 5 mars 2003StatutMembreDernière intervention11 mai 20112 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és276Date d'inscriptionjeudi 12 janvier 2006StatutMembreDernière intervention22 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és5487Date d'inscriptiondimanche 4 août 2002StatutMembreDernière intervention20 juin 201361 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és96Date d'inscriptionvendredi 17 décembre 2004StatutMembreDernière intervention13 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és5487Date d'inscriptiondimanche 4 août 2002StatutMembreDernière intervention20 juin 201361 6 mars 2007 à 18:09
Oui, SOAP = XML :-D
FREMYCOMPANY
Messages postés276Date d'inscriptionjeudi 12 janvier 2006StatutMembreDernière intervention22 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és403Date d'inscriptionvendredi 28 octobre 2005StatutMembreDernière intervention31 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és5487Date d'inscriptiondimanche 4 août 2002StatutMembreDernière intervention20 juin 201361 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és403Date d'inscriptionvendredi 28 octobre 2005StatutMembreDernière intervention31 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és5487Date d'inscriptiondimanche 4 août 2002StatutMembreDernière intervention20 juin 201361 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és403Date d'inscriptionvendredi 28 octobre 2005StatutMembreDernière intervention31 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és276Date d'inscriptionjeudi 12 janvier 2006StatutMembreDernière intervention22 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és276Date d'inscriptionjeudi 12 janvier 2006StatutMembreDernière intervention22 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és4936Date d'inscriptionlundi 17 février 2003StatutMembreDernière intervention14 février 201437 26 févr. 2007 à 13:36
oui... mais uniquement en C# :)
cs_Bidou
Messages postés5487Date d'inscriptiondimanche 4 août 2002StatutMembreDernière intervention20 juin 201361 26 févr. 2007 à 13:29
Ha oui tiens, j'avais jamais fait attention qu'on pouvait omettre les parenthèses...
sebmafate
Messages postés4936Date d'inscriptionlundi 17 février 2003StatutMembreDernière intervention14 février 201437 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és276Date d'inscriptionjeudi 12 janvier 2006StatutMembreDernière intervention22 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és276Date d'inscriptionjeudi 12 janvier 2006StatutMembreDernière intervention22 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és5487Date d'inscriptiondimanche 4 août 2002StatutMembreDernière intervention20 juin 201361 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és403Date d'inscriptionvendredi 28 octobre 2005StatutMembreDernière intervention31 août 2008 25 févr. 2007 à 20:49
Si une classe static peut avoir un constructeur statique.
cs_Bidou
Messages postés5487Date d'inscriptiondimanche 4 août 2002StatutMembreDernière intervention20 juin 201361 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és403Date d'inscriptionvendredi 28 octobre 2005StatutMembreDernière intervention31 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és5487Date d'inscriptiondimanche 4 août 2002StatutMembreDernière intervention20 juin 201361 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és403Date d'inscriptionvendredi 28 octobre 2005StatutMembreDernière intervention31 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...
2 oct. 2010 à 12:07
Merci
2 oct. 2010 à 12:05
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
23 sept. 2008 à 17:32
Merci
13 juil. 2007 à 14:12
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..
13 juil. 2007 à 13:04
13 juil. 2007 à 12:43
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
6 mars 2007 à 18:09
6 mars 2007 à 18:00
Binary = rapide, très efficace, même les champs private et les fields sont serialisés
6 mars 2007 à 17:57
Sinon attendons Orcas... Ca sort quand en version définitive ?
6 mars 2007 à 17:50
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...
6 mars 2007 à 14:08
6 mars 2007 à 08:15
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)
6 mars 2007 à 03:50
28 févr. 2007 à 16:27
26 févr. 2007 à 18:14
26 févr. 2007 à 13:36
26 févr. 2007 à 13:29
26 févr. 2007 à 11:30
ex :
[Serializable]
public class Personne {}
25 févr. 2007 à 21:03
25 févr. 2007 à 21:02
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.
25 févr. 2007 à 20:58
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).
25 févr. 2007 à 20:49
25 févr. 2007 à 20:37
25 févr. 2007 à 19:50
25 févr. 2007 à 09:53
Maintenant c'est clair qu'un XmlSerializer a ses limites (on trouve quelques articles intéressants en tapant "limitation of XMLSerializer" dans google).
25 févr. 2007 à 06:10
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...