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?

5voto

Gulzar Nazim Punkte 51098

Alle Objekte im Serialisierungsgraphen müssen serialisierbar sein.

Da XMLSerializer eine Blackbox ist, überprüfen Sie diese Links, wenn Sie weiter in den Serialisierungsprozess eintauchen möchten.

Ändern, wo XmlSerializer temporäre Assemblys ausgibt

ANLEITUNG: Debuggen in eine .NET XmlSerializer generierte Assembly

5voto

jkokorian Punkte 2595

Ich habe gerade den gleichen Fehler bekommen und festgestellt, dass ein Eigenschaft vom Typ IEnumerable das Problem war. Es scheint, dass IEnumerable nicht direkt serialisiert werden kann.

Stattdessen könnte man List verwenden.

5voto

Luca Punkte 11190

Wenn Sie spezifische Attribute (z. B. Dictionary oder eine Klasse) bearbeiten müssen, können Sie das IXmlSerialiable Interface implementieren, das Ihnen mehr Freiheit ermöglicht kostet jedoch mehr Code.

public class NetService : IXmlSerializable
{
    #region Data

        public string Identifier = String.Empty;

        public string Name = String.Empty;

        public IPAddress Address = IPAddress.None;
        public int Port = 7777;

    #endregion

    #region IXmlSerializable Implementation

        public XmlSchema GetSchema() { return (null); }

        public void ReadXml(XmlReader reader)
        {
            // Attributes
            Identifier = reader[XML_IDENTIFIER];
            if (Int32.TryParse(reader[XML_NETWORK_PORT], out Port) == false)
            throw new XmlException("unable to parse the element " + typeof(NetService).Name + " (badly formatted parameter " + XML_NETWORK_PORT);
            if (IPAddress.TryParse(reader[XML_NETWORK_ADDR], out Address) == false)
            throw new XmlException("unable to parse the element " + typeof(NetService).Name + " (badly formatted parameter " + XML_NETWORK_ADDR);
        }

        public void WriteXml(XmlWriter writer)
        {
            // Attributes
            writer.WriteAttributeString(XML_IDENTIFIER, Identifier);
            writer.WriteAttributeString(XML_NETWORK_ADDR, Address.ToString());
            writer.WriteAttributeString(XML_NETWORK_PORT, Port.ToString());
        }

        private const string XML_IDENTIFIER = "Id";

        private const string XML_NETWORK_ADDR = "Address";

        private const string XML_NETWORK_PORT = "Port";

    #endregion
}

Es gibt einen interessanten Artikel, der einen eleganten Weg zeigt, einen ausgeklügelten "Erweiterungsmechanismus" für den XmlSerializer zu implementieren.


Der Artikel sagt:

IXmlSerializable wird in der offiziellen Dokumentation behandelt, aber es wird angegeben, dass es nicht für die öffentliche Verwendung vorgesehen ist und keine weiteren Informationen bereitstellt. Dies zeigt, dass das Entwicklungsteam sich das Recht vorbehalten wollte, diesen Erweiterungspunkt künftig zu ändern, zu deaktivieren oder sogar vollständig zu entfernen. Solange Sie jedoch bereit sind, diese Unsicherheit zu akzeptieren und mit möglichen zukünftigen Änderungen umzugehen, spricht überhaupt nichts dagegen, es zu nutzen.

Aus diesem Grund schlage ich vor, eigene IXmlSerializable-Klassen zu implementieren, um zu vermeiden, dass zu komplizierte Implementierungen entstehen.

...es könnte einfach sein, unsere eigene benutzerdefinierte XmlSerializer-Klasse mithilfe von Reflection zu implementieren.

4voto

Charlie Salts Punkte 12529

Ich habe festgestellt, dass die Dictionary-Klasse in .Net 2.0 beim XML-Serialisieren nicht serialisierbar ist, aber gut serialisiert wird, wenn die binäre Serialisierung verwendet wird.

Ich habe einen Workaround hier gefunden.

3voto

LepardUK Punkte 1230

Ich habe dies kürzlich in einer Web-Referenz-Teilklasse erhalten, als ich eine neue Eigenschaft hinzugefügt habe. Die automatisch generierte Klasse fügte die folgenden Attribute hinzu.

    [System.Xml.Serialization.XmlElementAttribute(Order = XX)]

Ich musste ein ähnliches Attribut mit einer um eins höheren Reihenfolge als im automatisch generierten Sequenz hinzufügen und das hat es für mich behoben.

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