begin process at 2010 02 10 03:29:08
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Fichiers / Disque

 > PERSONNALISER LA SERIALIZATION XML AVEC LES ATTRIBUTS

PERSONNALISER LA SERIALIZATION XML AVEC LES ATTRIBUTS


 Information sur la source

Note :
8 / 10 - par 2 personnes
8,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Fichiers / Disque Source .NET ( DotNet ) Classé sous :serialization, custom, serialisation, attribute, attribut Niveau :Débutant Date de création :24/02/2007 Date de mise à jour :25/02/2007 22:42:52 Vu / téléchargé :10 861 / 771

Auteur : Bidou

Ecrire un message privé
Site perso
Ce membre participe au partage de revenus publicitaires
Commentaire sur cette source (24)
Ajouter un commentaire et/ou une note


 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 !

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

24 février 2007 23:48:44 :
MAJ Description
25 février 2007 22:42:52 :
Texte

 Sources du même auteur

Source avec Zip Source .NET (Dotnet) CHESS GAME CORE - LIBRAIRIE JEU D'ÉCHEC EN C#
Source avec Zip Source avec une capture Source .NET (Dotnet) CUBE-IT: PETIT JEU EN WPF
Source avec Zip Source avec une capture Source .NET (Dotnet) YOUTUBE VIEWER
Source avec Zip Source avec une capture Source .NET (Dotnet) COLOR WHEEL
Source avec Zip Source avec une capture Source .NET (Dotnet) PETIT EXEMPLE UTILISANT XAML ET WPF

 Sources de la même categorie

Source avec Zip PILOTER WORD VIA MICROSOFT.OFFICE.INTEROP.WORD par whismeril
Source avec Zip PILOTER EXCEL VIA MICROSOFT.OFFICE.INTEROP.EXCEL par whismeril
Source avec Zip Source .NET (Dotnet) CHECK IDENTICAL FILES par eldim
Source avec Zip Source avec une capture Source .NET (Dotnet) RICHTEXTBOX NUMÉROTÉ (NUMÉROS DE LIGNES) par jray
Source avec Zip Source avec une capture SURVEILLER FICHIERS CRÉÉS AVEC FILESYSTEMWATCHER AMÉLIORÉ par TheOnlyMaX

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture Source .NET (Dotnet) LIBRAIRIE TRÈS COMPLETTE DE CONTROLS WINFORMS PERSONNALISÉS par jmenfous
Source avec Zip Source .NET (Dotnet) MAFBINDERHELPER : UNE CLASSE POUR BINDER AUTOMATIQUEMENT VOS... par sebmafate
Source avec Zip Source avec une capture Source .NET (Dotnet) DESKTOP WINDOWS par dess4ever4960
Source avec Zip Source .NET (Dotnet) EXTENSION DES LISTES GÉNÉRIQUES (DESIGN PATTERN "DECORATEUR"... par yoannd
Source avec Zip Source avec une capture Source .NET (Dotnet) [C#] [XML] SERIALIZATION STRING, COLOR, ARRAYLIST, HASHTABLE... par scoubidou944

Commentaires et avis

Commentaire de mathmax le 25/02/2007 06:10:56

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...

Commentaire de Bidou le 25/02/2007 09:53:13 administrateur CS

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).

Commentaire de mathmax le 25/02/2007 19:50:34

Est ce qu'on peut sérialiser une classe static avec un XmlSerializer ?

Commentaire de Bidou le 25/02/2007 20:37:16 administrateur CS

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.

Commentaire de mathmax le 25/02/2007 20:49:02

Si une classe static peut avoir un constructeur statique.

Commentaire de Bidou le 25/02/2007 20:58:53 administrateur CS

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).

Commentaire de FREMYCOMPANY le 25/02/2007 21:02:00

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.

Commentaire de FREMYCOMPANY le 25/02/2007 21:03:56

Voila, j'ai relancé mon VS 2005, et l'add-in s'appelle XsdObjectGen

Commentaire de sebmafate le 26/02/2007 11:30:12 administrateur CS

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 {}

Commentaire de Bidou le 26/02/2007 13:29:56 administrateur CS

Ha oui tiens, j'avais jamais fait attention qu'on pouvait omettre les parenthèses...

Commentaire de sebmafate le 26/02/2007 13:36:49 administrateur CS

oui... mais uniquement en C# :)

Commentaire de FREMYCOMPANY le 26/02/2007 18:14:38

Ah bon ? en VB pas ? Jamais essayé de le faire mais bon, qu'est-ce que ca prend comme temps de les mettres ? :)

Commentaire de FREMYCOMPANY le 28/02/2007 16:27:14

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 !

Commentaire de mathmax le 06/03/2007 03:50:25

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" ?

Commentaire de Bidou le 06/03/2007 08:15:01 administrateur CS

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)

Commentaire de mathmax le 06/03/2007 14:08:40

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...

Commentaire de Bidou le 06/03/2007 17:50:52 administrateur CS

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...

Commentaire de mathmax le 06/03/2007 17:57:25

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 ?

Commentaire de FREMYCOMPANY le 06/03/2007 18:00:01

Soap = XML :=)

Binary = rapide, très efficace, même les champs private et les fields sont serialisés

Commentaire de Bidou le 06/03/2007 18:09:30 administrateur CS

Oui, SOAP = XML :-D

Commentaire de benjiiim94 le 13/07/2007 12:43:34

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

Commentaire de Bidou le 13/07/2007 13:04:45 administrateur CS

Si mes souvenirs sont bons, ces events ne sont disponible que pour les serialization binaires, pas XML ! (pas d'équivalence)

Commentaire de FREMYCOMPANY le 13/07/2007 14:12:35

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..

Commentaire de madebyhisto le 23/09/2008 17:32:01

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

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Custom attribute - Fonctionnement [ par t00f ] Bonjour à tous,J'aimerais en savoir plus sur l'utilisation des custom attributes ( la documentation Msdn est assez pauvre à ce niveau, enfin je trouve Assembly: custom attributes [ par jusob ] Bonjour, j'utilise des custom attributes du genre: [assembly:AssemblyTitle("First plugin")] [assembly:AssemblyCompany("MySelf")] [assembly:Assemb Serialization sélective dans un formulaire [ par Padkartiai ] Bonjour,Sauriez-vous s'il est possible de faire une s&#233;rialisation s&#233;lective dans un formulaire windows ?Je souhaite uniquement conserver la Serialisation [ par RM50Man ] Quand doit on utiliser la serialisation?RM50man [C#] XML - Serialisation & reflexion (la j'en manque;p) [ par scoubidou944 ] Bon autant dire que j'en bave avec XMLL'init passe pas : XmlTextWriter oWriter = new XmlTextWriter (@"d:\test2.xml", < C# Xml attribute [ par shad252 ] Bonjour, voila mon probleme : je creer un fhichier xml avec differents elements... Plus tard je veux ajouter un attribut &#224; un de mes elements par [C#] SOAP & Serialization [ par scoubidou944 ] mon code marche enfin &#224; moiti&#233;. lors de la d&#233;s&#233;rialisation, je me prend souvent SerializationException : Erreu d'analyse, aucun as Serialisation entre plusieurs applications [ par yes ] Bonjour,Voil&#224; mon probl&#232;me :je sauvegarde des donn&#233;es dans une application avec IFormatter formatter = new BinaryFormatter();tout ce p Packaging MSI et custom actions [ par titeoe ] Bonjour, Je travaille actuellement sur un package de d&#233;ploiement d'assemblys pour un EAI (BizTalk Serevr 2004) .Mon package est tres simple :&nbs Serialisation d'une image [ par Equinox84 ] bonjour, je voudrais savoir s'il est possible de serialiser un objet&nbsp;&nbsp; Image&nbsp;&nbsp; (System.Drawing)&nbsp; d'ou je prends la source su


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,045 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales