Mit C # .NET 2.0 habe ich eine zusammengesetzte Datenklasse, die das [Serializable]
Attribut enthält. Ich erstelle eine XMLSerializer
Klasse und übergebe diese an den Konstruktor:
XmlSerializer serializer = new XmlSerializer(typeof(DataClass));
Ich bekomme eine Ausnahme mit den Worten:
Es gab einen Fehler, der den Typ widerspiegelte.
Innerhalb der Datenklasse befindet sich ein weiteres zusammengesetztes Objekt. Muss das [Serializable]
Attribut auch vorhanden sein oder wird es rekursiv auf alle darin enthaltenen Objekte angewendet, indem es sich auf dem obersten Objekt befindet?
IList
es sein mussteList
.Denken Sie daran, dass serialisierte Klassen Standardkonstruktoren (dh parameterlose Konstruktoren) haben müssen. Wenn Sie überhaupt keinen Konstruktor haben, ist das in Ordnung. Wenn Sie jedoch einen Konstruktor mit einem Parameter haben, müssen Sie auch den Standardkonstruktor hinzufügen.
quelle
Ich hatte ein ähnliches Problem und es stellte sich heraus, dass der Serializer nicht zwischen zwei Klassen mit demselben Namen unterscheiden konnte (eine war eine Unterklasse der anderen). Die innere Ausnahme sah folgendermaßen aus:
'Typ 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.
Wobei BaseNamespace.SubNamespace.Class1 eine Unterklasse von BaseNamespace.Class1 ist.
Was ich tun musste, war ein Attribut zu einer der Klassen hinzuzufügen (ich fügte der Basisklasse hinzu):
Hinweis: Wenn Sie mehr Klassenebenen haben, müssen Sie diesen ebenfalls ein Attribut hinzufügen.
quelle
Beachten Sie auch, dass
XmlSerializer
abstrakte Eigenschaften nicht serialisiert werden können. Siehe meine Frage hier (zu der ich den Lösungscode hinzugefügt habe).XML-Serialisierung und geerbte Typen
quelle
Die häufigsten Gründe von mir:
quelle
Alle Objekte im Serialisierungsdiagramm müssen serialisierbar sein.
Da
XMLSerializer
es sich um eine Blackbox handelt, überprüfen Sie diese Links, wenn Sie den Serialisierungsprozess weiter untersuchen möchten.Ändern, wo XmlSerializer temporäre Assemblys ausgibt
SO WIRD'S GEMACHT: Debuggen in einer von .NET XmlSerializer generierten Assembly
quelle
Wenn Sie bestimmte Attribute (z. B. Dictionary oder eine beliebige Klasse) verarbeiten müssen, können Sie die IXmlSerialiable- Schnittstelle implementieren , die Ihnen mehr Freiheit auf Kosten einer ausführlicheren Codierung ermöglicht .
Es gibt einen interessanten Artikel , der eine elegante Methode zum Implementieren einer ausgeklügelten Methode zum "Erweitern" des XmlSerializers zeigt.
Der Artikel sagt:
Aus diesem Grund empfehle ich, eigene
IXmlSerializable
Klassen zu implementieren , um zu komplizierte Implementierungen zu vermeiden.... es könnte einfach sein, unsere benutzerdefinierte
XmlSerializer
Klasse mithilfe von Reflektion zu implementieren .quelle
Ich habe festgestellt, dass die Dictionary-Klasse in .Net 2.0 nicht mit XML serialisierbar ist, sondern bei Verwendung der binären Serialisierung gut serialisiert werden kann.
Ich habe hier eine Arbeit gefunden .
quelle
Ich habe dies kürzlich in einer Webreferenz-Teilklasse erhalten, als ich eine neue Eigenschaft hinzugefügt habe. Die automatisch generierte Klasse fügte die folgenden Attribute hinzu.
Ich musste ein ähnliches Attribut mit einer Reihenfolge hinzufügen, die höher als die letzte in der automatisch generierten Sequenz ist, und dies hat es für mich behoben.
quelle
Ich habe gerade den gleichen Fehler erhalten und festgestellt, dass eine Eigenschaft vom Typ
IEnumerable<SomeClass>
das Problem war. Es scheint, dassIEnumerable
nicht direkt serialisiert werden kann.Stattdessen könnte man verwenden
List<SomeClass>
.quelle
Ich dachte auch, dass das Serializable-Attribut auf dem Objekt sein muss, aber wenn ich kein vollständiger Noob bin (ich bin mitten in einer Late-Night-Codierungssitzung), funktioniert das Folgende vom SnippetCompiler :
Ich würde mir vorstellen, dass der XmlSerializer die öffentlichen Eigenschaften reflektiert.
quelle
Ich hatte eine Situation, in der der Orden für zwei Elemente hintereinander gleich war
.... etwas Code ...
Als ich den Code so änderte, dass die Reihenfolge für jede neue Eigenschaft in der Klasse um eins erhöht wurde, verschwand der Fehler.
quelle
Ich habe den gleichen Fehler erhalten, als ich eine Eigenschaft mit einem Datentyp erstellt habe -
Type
. Daraufhin wurde ein Fehler angezeigt. Es gab einen Fehler, der den Typ widerspiegelte. Ich überprüfte ständig die 'InnerException' jeder Ausnahme aus dem Debug-Dock und bekam den spezifischen Feldnamen (derType
in meinem Fall war ). Die Lösung lautet wie folgt:quelle
Beachten Sie außerdem, dass Sie Steuerelemente der Benutzeroberfläche nicht serialisieren können und dass jedes Objekt, das Sie in die Zwischenablage übergeben möchten, serialisierbar sein muss, da es sonst nicht an andere Prozesse übergeben werden kann.
quelle
Ich habe die
NetDataSerialiser
Klasse verwendet, um meine Domänenklassen zu serialisieren. NetDataContractSerializer-Klasse .Die Domänenklassen werden von Client und Server gemeinsam genutzt.
quelle
Ich hatte das gleiche Problem und in meinem Fall hatte das Objekt eine ReadOnlyCollection. Eine Sammlung muss die Add-Methode implementieren, um serialisierbar zu sein.
quelle
Ich habe eine etwas andere Lösung als alle hier bisher beschriebenen, also für jede zukünftige Zivilisation hier meine!
Ich hatte einen Datentyp von "Zeit" deklariert, da der ursprüngliche Typ a war,
TimeSpan
und anschließend in a geändertString
:Der eigentliche Typ war jedoch eine Zeichenfolge
Durch Entfernen der
DateType
EigenschaftXml
kann die serialisiert werdenquelle
Oder
quelle