OVH Cloud OVH Cloud

Debuggage de deserialization

3 réponses
Avatar
Guillaume JAY
Je travaille actuellement sur du xml.
Trés exactement, j'ai pris un fichier xml "reel", j'ai fait generer
son schema par VS2005, puis creer la classe de traitement par xsd.exe

Le probleme, c'est que ce genre d'automatisme, si c'est déjà trés
bien, c'est pas parfait. Genre, si dans mon xml de base, j'avais un
champ de valeur 1, il me le type en Byte, du coup, si ce même champ
peut prendre la valeur de 300, bah, la classe déclenche une exception
lors de la deserialization, tres logiquement.

Enfin bref. La ou je veux venir, c'est est ce qu'il y a un moyen a
partir de l'exception pour savoir quel champ exactement a provoqué
l'erreur ?(sans mettre des try catch dasn tout le code autogeneré, ce
qui serait assez contreproductif, a moins qu'il y ait un outil
autmatique pour ca :))

Merci,

Guillaume

3 réponses

Avatar
Frederic Melantois
Bonsoir,

Si j'ai bien tout compris : Vous aviez un fichier xml, vous avez fabriqué un
schema. Vous nous dites : j'ai une valeur de 1, le champ est alors typé en
byte dans le schema. Qu'est-ce qui vous empêche de le typer correctement
vous-même en int (via le designer ou l'éditeur xml) ?

L'utilitaire xsd génère un dataset dérivé fidèle au schéma. Si le schéma
n'est pas bon, la classe ne sera pas celle que vous attendiez.

Frédéric Mélantois

"Guillaume JAY" a écrit dans le message de
news:
Je travaille actuellement sur du xml.
Trés exactement, j'ai pris un fichier xml "reel", j'ai fait generer
son schema par VS2005, puis creer la classe de traitement par xsd.exe

Le probleme, c'est que ce genre d'automatisme, si c'est déjà trés
bien, c'est pas parfait. Genre, si dans mon xml de base, j'avais un
champ de valeur 1, il me le type en Byte, du coup, si ce même champ
peut prendre la valeur de 300, bah, la classe déclenche une exception
lors de la deserialization, tres logiquement.

Enfin bref. La ou je veux venir, c'est est ce qu'il y a un moyen a
partir de l'exception pour savoir quel champ exactement a provoqué
l'erreur ?(sans mettre des try catch dasn tout le code autogeneré, ce
qui serait assez contreproductif, a moins qu'il y ait un outil
autmatique pour ca :))

Merci,

Guillaume


Avatar
Guillaume JAY
On Fri, 27 May 2005 22:27:58 +0200, "Frederic Melantois"
wrote:
Si j'ai bien tout compris : Vous aviez un fichier xml, vous avez fabriqué un
schema. Vous nous dites : j'ai une valeur de 1, le champ est alors typé en
byte dans le schema. Qu'est-ce qui vous empêche de le typer correctement
vous-même en int (via le designer ou l'éditeur xml) ?



Rien, une fois que je sais le champ qui "plante". Ce n'est pas ma
question.

L'utilitaire xsd génère un dataset dérivé fidèle au schéma. Si le schéma
n'est pas bon, la classe ne sera pas celle que vous attendiez.



Bien sur. Mais le schema etant généré automatiqument a partir d'un
fichier xml de données, VS2005 fait ce qu'il peut, et a ce que j'ai pu
voir, a tendance a essayer d'economiser les octets sur les entier.
Seulement, voila, avec un autre xml de données, ca passe pas.
(Incidemment, il ne s'agit pas d'un dataset, mais d'une classe)

Enfin, bref, le probleme n'est pas de solutionner le probleme, ou de
comprendre pourquoi il y en a un.

Reprenons : le xml ne correspond pas a mon xsd. L'exception déclenchée
à la deserialization est assez générale (pour ce que j'en ai vu), et
notamment, ne me donne pas quel champ contient des données invalides.
Est il possible d'obtenir ce champ pour l'afficher dans ma msgbox
d'erreur ?

(Parceque bien, sur, je peux faire un chercher remplacer sur ma classe
générée de tous les bytes par des integers, et j'aurai plus de souci,
mais je voudrai une solution plus élégante, surtout qu'il n'y pas que
ce type d'erreur)


Guillaume
Avatar
Frederic Melantois
Bonjour,

Nous nous sommes pas compris.

Il faut que le schema soit bon et pour cela, il faut que vous connaissiez le
typage à effectuer sur chaque champ. C'est pour cela que vous devez
impérativement modifier le schema si nécessaire si vous voulez que le
dataset hérité généré par xsd corresponde à votre fichier xml.

Pour l'exception, vous pouvez exploiter les InnerExceptions successifs.

Frédéric Mélantois




"Guillaume JAY" a écrit dans le message de
news:
On Fri, 27 May 2005 22:27:58 +0200, "Frederic Melantois"
wrote:
Si j'ai bien tout compris : Vous aviez un fichier xml, vous avez fabriqué
un
schema. Vous nous dites : j'ai une valeur de 1, le champ est alors typé en
byte dans le schema. Qu'est-ce qui vous empêche de le typer correctement
vous-même en int (via le designer ou l'éditeur xml) ?



Rien, une fois que je sais le champ qui "plante". Ce n'est pas ma
question.

L'utilitaire xsd génère un dataset dérivé fidèle au schéma. Si le schéma
n'est pas bon, la classe ne sera pas celle que vous attendiez.



Bien sur. Mais le schema etant généré automatiqument a partir d'un
fichier xml de données, VS2005 fait ce qu'il peut, et a ce que j'ai pu
voir, a tendance a essayer d'economiser les octets sur les entier.
Seulement, voila, avec un autre xml de données, ca passe pas.
(Incidemment, il ne s'agit pas d'un dataset, mais d'une classe)

Enfin, bref, le probleme n'est pas de solutionner le probleme, ou de
comprendre pourquoi il y en a un.

Reprenons : le xml ne correspond pas a mon xsd. L'exception déclenchée
à la deserialization est assez générale (pour ce que j'en ai vu), et
notamment, ne me donne pas quel champ contient des données invalides.
Est il possible d'obtenir ce champ pour l'afficher dans ma msgbox
d'erreur ?

(Parceque bien, sur, je peux faire un chercher remplacer sur ma classe
générée de tous les bytes par des integers, et j'aurai plus de souci,
mais je voudrai une solution plus élégante, surtout qu'il n'y pas que
ce type d'erreur)


Guillaume