367 Stimmen

XmlSerializer - Es ist ein Fehler beim Reflexionsvorgang des Typs aufgetreten.

Verwenden von C# .NET 2.0, ich habe eine zusammengesetzte Datenklasse, die das [Serializable] Attribut hat. Ich erstelle eine XMLSerializer Klasse und übergebe sie dem Konstruktor:

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

Ich erhalte eine Ausnahme mit der Meldung:

Es trat ein Fehler beim Reflektieren des Typs auf.

In der Datenklasse gibt es ein weiteres zusammengesetztes Objekt. Braucht auch dieses das [Serializable] Attribut, oder wird es durch das Attribut am obersten Objekt rekursiv auf alle Objekte darin angewendet?

442voto

Lamar Punkte 9369

Schauen Sie sich die innere Ausnahme an, die Sie erhalten. Sie wird Ihnen sagen, welches Feld/Eigenschaft Probleme beim Serialisieren hat.

Sie können Felder/Eigenschaften von der XML-Serialisierung ausschließen, indem Sie sie mit dem [XmlIgnore] Attribut kennzeichnen.

XmlSerializer nutzt nicht das [Serializable] Attribut, daher bezweifle ich, dass das das Problem ist.

119voto

Jeremy McGee Punkte 24034

Denken Sie daran, dass serialisierte Klassen standardmäßige (d. H. parameterlose) Konstruktoren haben müssen. Wenn Sie überhaupt keinen Konstruktor haben, ist das in Ordnung; aber wenn Sie einen Konstruktor mit einem Parameter haben, müssen Sie auch den Standardkonstruktor hinzufügen.

29voto

Dennis Calla Punkte 749

Ich hatte ein ähnliches Problem, und es stellte sich heraus, dass der Serializer nicht zwischen 2 Klassen unterscheiden konnte, die den gleichen Namen hatten (eine war eine Unterklasse der anderen). Die innere Ausnahme sah so aus:

'Typen BaseNamespace.Class1' und 'BaseNamespace.SubNamespace.Class1' verwenden beide den XML-Typnamen 'Class1' aus dem Namespace ''. Verwenden Sie XML-Attribute, um einen eindeutigen XML-Namen und/oder Namespace für den Typ anzugeben.

Wo BaseNamespace.SubNamespace.Class1 eine Unterklasse von BaseNamespace.Class1 ist.

Was ich tun musste, war, einem der Klassen ein Attribut hinzuzufügen (ich habe es zur Basisklasse hinzugefügt):

[XmlType("BaseNamespace.Class1")]

Hinweis: Wenn Sie mehr Schichten von Klassen haben, müssen Sie diesen ebenfalls ein Attribut hinzufügen.

7voto

Rob Cooper Punkte 28132

Auch beachten Sie, dass XmlSerializer keine abstrakten Eigenschaften serialisieren kann. Siehe meine Frage hier (zu der ich den Lösungscode hinzugefügt habe)..

XML Serialisierung und abgeleitete Typen

7voto

Stefan Michev Punkte 4338

Meistens auftretende Gründe von mir:

 - das zu serialisierende Objekt hat keinen parameterlosen Konstruktor
 - das Objekt enthält ein Dictionary
 - das Objekt hat einige öffentliche Interface-Mitglieder

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X