En utilisant C # .NET 2.0, j'ai une classe de données composite qui a l' [Serializable]
attribut dessus. Je crée une XMLSerializer
classe et la transmets au constructeur:
XmlSerializer serializer = new XmlSerializer(typeof(DataClass));
Je reçois une exception disant:
Une erreur s'est produite lors de la réflexion du type.
À l'intérieur de la classe de données, il y a un autre objet composite. Doit-il également avoir l' [Serializable]
attribut, ou en le plaçant sur l'objet supérieur, l'applique-t-il récursivement à tous les objets à l'intérieur?
IList
quand elle devait l'êtreList
.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 bien; mais si vous avez un constructeur avec un paramètre, vous devrez également ajouter celui par défaut.
la source
J'ai eu un problème similaire, et il s'est avéré que le sérialiseur ne pouvait pas distinguer entre 2 classes que j'avais avec le même nom (l'une était une sous-classe de l'autre). L'exception intérieure ressemblait à ceci:
'Types BaseNamespace.Class1' et 'BaseNamespace.SubNamespace.Class1' utilisent tous deux le nom de type XML, 'Class1', à partir de l'espace de noms ''. Utilisez des 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 était d'ajouter un attribut à l'une des classes (j'ai ajouté à la classe de base):
Remarque: Si vous avez plusieurs couches de classes, vous devez également leur ajouter un attribut.
la source
Sachez également que
XmlSerializer
vous ne pouvez 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
la source
Les raisons les plus courantes de moi:
la source
Tous les objets du graphe de sérialisation doivent être sérialisables.
Puisqu'il
XMLSerializer
s'agit d'une boîte noire, vérifiez ces liens si vous souhaitez poursuivre le débogage dans le processus de sérialisation.Modification de l'emplacement de sortie des assemblys temporaires par XmlSerializer
Comment: déboguer dans un assembly généré par .NET XmlSerializer
la source
Si vous devez gérer des attributs spécifiques (c.-à-d. Dictionnaire ou n'importe quelle classe), vous pouvez implémenter l' interface IXmlSerialiable , qui vous donnera plus de liberté au prix d'un codage plus détaillé .
Il y a un article intéressant , qui montre une manière élégante d'implémenter une manière sophistiquée "d'étendre" le XmlSerializer.
L'article dit:
Parce que cela, je suggère d'implémenter vos propres
IXmlSerializable
classes, afin d'éviter des implémentations trop compliquées.... il pourrait être simple d'implémenter notre
XmlSerializer
classe personnalisée en utilisant la réflexion.la source
J'ai découvert que la classe Dictionary dans .Net 2.0 n'est pas sérialisable à l'aide de XML, mais sérialise bien lorsque la sérialisation binaire est utilisée.
J'ai trouvé un travail par ici .
la source
J'ai récemment obtenu ceci dans une classe partielle de référence Web lors de l'ajout d'une nouvelle propriété. La classe générée automatiquement ajoutait les attributs suivants.
J'avais besoin d'ajouter un attribut similaire avec un ordre supérieur au dernier dans la séquence générée automatiquement et cela l'a corrigé pour moi.
la source
Je viens de recevoir la même erreur et j'ai découvert qu'une propriété de type
IEnumerable<SomeClass>
était le problème. Il semble queIEnumerable
cela ne peut pas être sérialisé directement.Au lieu de cela, on pourrait utiliser
List<SomeClass>
.la source
Moi aussi, je pensais que l'attribut Serializable devait être sur l'objet, mais à moins que je ne sois un noob complet (je suis au milieu d'une session de codage tard dans la nuit), les œuvres suivantes du SnippetCompiler :
J'imagine que le XmlSerializer utilise la réflexion sur les propriétés publiques.
la source
J'ai eu une situation où l'Ordre était le même pour deux éléments d'affilée
.... du code ...
Lorsque j'ai changé le code pour incrémenter l'ordre de un pour chaque nouvelle propriété de la classe, l'erreur a disparu.
la source
J'obtenais la même erreur lorsque j'ai créé une propriété ayant un type de données -
Type
. Sur ce, je recevais une erreur - Il y avait une erreur reflétant le type. J'ai continué à vérifier l '«InnerException» de chaque exception du débogage et j'ai obtenu le nom de champ spécifique (qui étaitType
) dans mon cas. La solution est la suivante:la source
Notez également que vous ne pouvez pas sérialiser les contrôles de l'interface utilisateur et que tout objet que vous souhaitez passer dans le presse-papiers doit être sérialisable sinon il ne peut pas être transmis à d'autres processus.
la source
J'utilise la
NetDataSerialiser
classe pour sérialiser mes classes de domaine. Classe NetDataContractSerializer .Les classes de domaine sont partagées entre le client et le serveur.
la source
J'ai eu le même problème et dans mon cas, l'objet avait une ReadOnlyCollection. Une collection doit implémenter la méthode Add pour être sérialisable.
la source
J'ai une solution légèrement différente à toutes celles décrites ici jusqu'à présent, donc pour toute civilisation future, voici la mienne!
J'avais déclaré un type de données de "temps" car le type d'origine était un
TimeSpan
et changé par la suite en unString
:mais le type réel était une chaîne
en supprimant la
DateType
propriété, leXml
peut être sérialiséla source
Ou
la source