Personnaliser la serialization xml avec les attributs

Soyez le premier à donner votre avis sur cette source.

Vue 16 235 fois - Téléchargée 1 022 fois

Description

Serialization Xml personnalisée, Custom Xml serialization C#

Ce code très simple s'adresse aux personnes qui ne connaissent pas ou peu la Serialization XML.
Le but est de montrer comment utiliser les attributs XmlXXXAttribute pour personnaliser la façon dont est généré le fichier XML.

A travers un petit exemple qui sauve un objet Configurations qui contient entre autre une collection de Personne (définie elle-même par un Nom, Age, Sexe, etc.), je montre l'utilisation des dix Attributs qui me semblent les plus courant :

1. Serializable()
2. XmlType()
3. XmlAttribute()
4. XmlElement()
5. XmlText()
6. XmlIgnore()
7. XmlEnum()
8. XmlRoot()
9. XmlArray()
10. XmlArrayItem()

Notez qu'on peut utiliser ses classes avec leur nom long XmlXXXAttribute ou leur nom court XmlXXX
Par exemple, XmlText est équivalent à XmlTextAttribute

Notez également que pour qu'une classe soit Serializable, elle doit remplir certains critères :

1) Déclarer la classe avec l'attribut [Serializable()]. Cet attribut est obligatoire pour les classes qui seront
serializée avec un BinaryFormatter ou SOAPFormatter mais c'est tout de même une bonne pratique de le mettre aussi
pour les classes qui seront serializées avec un XmlSerializer.
2) La classe doit absolument être publique.
3) La classe doit absolument avoir un constructeur sans paramètre.
4) Uniquement les membres publics seront serializés pour un XmlSerializer !

Conclusion :


Si vous avez d'autres attributs que vous utilisez régulièrement et qui ne figurent pas dans la liste ci-dessus, vous pouvez toujours le proposer pour que je l'ajoute.
Les commentaires sont les bienvenus !

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

whismeril
Messages postés
13729
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
15 septembre 2019
302 -
Ha j'ai oublier de préciser que ma collection de diplome est un champ de Student ou de Person dans ton exemple.
Merci
whismeril
Messages postés
13729
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
15 septembre 2019
302 -
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
27
Date d'inscription
mercredi 5 mars 2003
Statut
Membre
Dernière intervention
11 mai 2011
2 -
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
278
Date d'inscription
jeudi 12 janvier 2006
Statut
Membre
Dernière intervention
22 décembre 2008
-
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
5507
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
38 -
Si mes souvenirs sont bons, ces events ne sont disponible que pour les serialization binaires, pas XML ! (pas d'équivalence)

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.