Sérialisation lente

Résolu
cs_mathmax Messages postés 403 Date d'inscription vendredi 28 octobre 2005 Statut Membre Dernière intervention 31 août 2008 - 24 févr. 2007 à 11:49
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 - 24 févr. 2007 à 17:16
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

cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
24 févr. 2007 à 17:16
Non, il va regénérer.

/*
coq
MVP Visual C#
CoqBlog
*/
3
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
24 févr. 2007 à 12:36
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
*/
0
cs_mathmax Messages postés 403 Date d'inscription vendredi 28 octobre 2005 Statut Membre Dernière intervention 31 août 2008
24 févr. 2007 à 12:57
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
0
cs_mathmax Messages postés 403 Date d'inscription vendredi 28 octobre 2005 Statut Membre Dernière intervention 31 août 2008
24 févr. 2007 à 13:02
J'oubliais : où se trouve le programme Sgen ? Est-il par défaut installé avec le framework 2 ?

Mathmax
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
24 févr. 2007 à 13:33
Oui, il suffit de démarrer l'invite de commande (celle de VS donc).
Pour avoir les paramètres: Sgen /?

<hr />
-Blog-
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
24 févr. 2007 à 13:45
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
*/
0
cs_mathmax Messages postés 403 Date d'inscription vendredi 28 octobre 2005 Statut Membre Dernière intervention 31 août 2008
24 févr. 2007 à 15:42
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
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
24 févr. 2007 à 16:48
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
*/
0
cs_mathmax Messages postés 403 Date d'inscription vendredi 28 octobre 2005 Statut Membre Dernière intervention 31 août 2008
24 févr. 2007 à 17:00
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
0
Rejoignez-nous