348 votes

XmlSerializer - There was an error reflecting type

En utilisant C# .NET 2.0, j'ai une classe de données composites qui a l'avantage d'avoir les caractéristiques suivantes [Serializable] sur cet attribut. Je crée un XMLSerializer et le passer dans le constructeur :

XmlSerializer serializer = new XmlSerializer(typeof(DataClass));

Je reçois une exception disant :

Il y avait une erreur reflétant le type.

À l'intérieur de la classe de données se trouve un autre objet composite. Doit-il également avoir l'attribut [Serializable] ou en l'ayant sur l'objet supérieur, l'applique-t-il récursivement à tous les objets à l'intérieur ?

427voto

Lamar Points 3981

Regardez l'exception interne que vous obtenez. Elle vous indiquera le champ ou la propriété que vous avez du mal à sérialiser.

Vous pouvez exclure des champs/propriétés de la sérialisation xml en les décorant avec l'attribut [XmlIgnore()].

Je ne pense pas que XmlSerializer utilise l'attribut [Serializable], donc je doute que ce soit le problème.

113voto

Jeremy McGee Points 13826

N'oubliez pas que les classes sérialisées doivent avoir des constructeurs par défaut (c'est-à-dire sans paramètre). Si vous n'avez pas de constructeur du tout, c'est très bien ; mais si vous avez un constructeur avec un paramètre, vous devrez également ajouter le constructeur par défaut.

26voto

Dennis Calla Points 221

J'ai eu un problème similaire, et il s'est avéré que le sérialiseur ne pouvait pas faire la distinction entre 2 classes que j'avais avec le même nom (l'une était une sous-classe de l'autre). L'exception interne ressemblait à ceci :

Les types BaseNamespace.Class1 et BaseNamespace.SubNamespace.Class1 utilisent tous deux le nom de type XML, 'Class1', de l'espace de noms ''. Utilisez les attributs XML pour spécifier un nom XML unique et/ou un espace de noms pour le type.

Où BaseNamespace.SubNamespace.Class1 est une sous-classe de BaseNamespace.Class1.

Ce que je devais faire, c'était ajouter un attribut à l'une des classes (j'ai ajouté à la classe de base) :

[XmlType("BaseNamespace.Class1")]

Remarque : si vous avez plusieurs couches de classes, vous devez également leur ajouter un attribut.

7voto

Rob Cooper Points 15945

Sachez également que XmlSerializer ne peut pas sérialiser les propriétés abstraites.. Voir ma question ici (à laquelle j'ai ajouté le code de la solution) .

Sérialisation XML et types hérités

5voto

Gulzar Nazim Points 35342

Tous les objets du graphe de sérialisation doivent être sérialisables.

Puisque XMLSerializer est une boîte noire, vérifiez ces liens si vous voulez déboguer davantage dans le processus de sérialisation

Modification de l'endroit où XmlSerializer sort les assemblages temporaires

Comment déboguer dans un assemblage généré par .NET XmlSerializer ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X