Sérialisation lente [Résolu]

Signaler
Messages postés
403
Date d'inscription
vendredi 28 octobre 2005
Statut
Membre
Dernière intervention
31 août 2008
-
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
-
Bonjour,

J'ai besoin de sérialiser/désérialiser un objet qui contient seulement 2 propriétés de type string.
Quand j'utilise la classe XmlSerializer pour faire celà, ça me prend plus de 3 secondes pour désérialisation.
Quand je charge moi même le document xml dans un XmlDocument puis que j'affecte au propriété les valeur des noeuds que je souhaite désérialiser, ça ne me prends pas plus d'une seconde.
Comment expliquer une telle différence de performance ?
Je remarque en fait que c'est la création de l'objet XmlSerializer qui prend la majeur partie du temps dans le premier cas. Pourquoi ?

Mathmax

9 réponses

Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
86
Non, il va regénérer.

/*
coq
MVP Visual C#
CoqBlog
*/
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
86
Salut,

En fait à la première initialisation (durant l'execution du processus) pour un type, XmlSerializer génère et compile du code pour la sérialisation/désérialisation. D'où la lenteur.

Je t'invite à jeter un oeil au pragraphe "Use Serialization Wisely" de cet article : CLR Inside Out : Improving Application Startup Time
Ainsi qu'à la doc de l'outil sgen (XML Serializer Generator).

/*
coq
MVP Visual C#
CoqBlog
*/
Messages postés
403
Date d'inscription
vendredi 28 octobre 2005
Statut
Membre
Dernière intervention
31 août 2008

Merci.
Donc je dois compiler ma classe, puis éxécuter sgen pour généré une dll. Mais comment après indiquer au XmlSerializer qu'il doit utiliser la dll générée plutot que de générer lui même du code ?

Mathmax
Messages postés
403
Date d'inscription
vendredi 28 octobre 2005
Statut
Membre
Dernière intervention
31 août 2008

J'oubliais : où se trouve le programme Sgen ? Est-il par défaut installé avec le framework 2 ?

Mathmax
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
51
Oui, il suffit de démarrer l'invite de commande (celle de VS donc).
Pour avoir les paramètres: Sgen /?

<hr />
-Blog-
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
86
Il s'installe effectivement avec le SDK .NET 2.0 (pas avec le Runtime), et se trouve donc dans %ProgramFiles%\Microsoft Visual Studio 8\SDK\v2.0\Bin si tu utilises VS2005 comme IDE pour tes développements .NET 2.0

/*
coq
MVP Visual C#
CoqBlog
*/
Messages postés
403
Date d'inscription
vendredi 28 octobre 2005
Statut
Membre
Dernière intervention
31 août 2008

Ok et comment indiquer au XmlSerializer qu'il doit utiliser la dll générée et non générer lui même du code ?

Mathmax
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
86
En ne faisant rien justement, à part laisser l'assembly généré "<nom de l'assembly contenant le type>.XmlSerializers.dll" dans le même répertoire.

/*
coq
MVP Visual C#
CoqBlog
*/
Messages postés
403
Date d'inscription
vendredi 28 octobre 2005
Statut
Membre
Dernière intervention
31 août 2008

Quand tu dis : "XmlSerializer génère et compile du code pour la sérialisation/désérialisation".

Tu veux dire qu'il fait celà à chaque exécution ? C'est à dire une fois que le programme à fini de s'éxécuter il détruit la dll ? Ou alors si je relance le programme une deuxième fois il réutilisera la dll déjà crée ?

Mathmax