2015-06-25 4 views
7

ichWie XML-Attribut, um benutzerdefiniertes Objekt während der Deserialisierung in C# mit XmlSerializer

InvalidCastException konvertieren: Wert ist kein Cabrio Objekt: System.String zu IdTag

beim Versuch, das XML-Attribut deserialisieren.

Hier ist die Probe xml:

<?xml version="1.0" encoding="windows-1250"?> 
<ArrayOfItem xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Item Name="Item Name" ParentId="SampleId" /> 
</ArrayOfItem> 

Beispielklassen:

public class Item 
{ 
    [XmlAttribute] 
    public string Name { get; set; } 

    [XmlAttribute] 
    public IdTag ParentId { get; set; } 
} 

[Serializable] 
public class IdTag 
{ 
    public string id; 
} 

Die Ausnahme von Convert.ToType() Methode ausgelöst wird (die von XmlSerializer genannt). AFAIK gibt es keine Möglichkeit, IConvertible Schnittstelle für System.String "zu implementieren", um zu IdTag zu konvertieren. Ich weiß, dass ich eine Proxy-Eigenschaft implementieren kann:

Gibt es einen anderen Weg?

Antwort

2

Sie müssen dem XmlSerializer mitteilen, welche Zeichenfolge er in Ihrem IdTag Objekt suchen muss. Vermutlich gibt es eine Eigenschaft des Objekts, das serialisiert werden soll (nicht das gesamte Objekt).

So konnten Sie dies ändern:

[XmlAttribute] 
public IdTag ParentId { get; set; } 

dazu:

[XmlIgnore] 
public IdTag ParentIdTag { get; set; } 

[XmlAttribute] 
public string ParentId 
{ 
    get { return ParentIdTag.id; } 
    set { ParentIdTag.id = value; } 
} 

Beachten Sie den Unterschied zwischen diesem und dem, was Sie auf dem Laufenden - wenn Sie diese deserialisiert, Ihre ParentIdTag Proxy-Objekt sollte richtig sein initialisiert.

+0

Definitiv eine Verbesserung - verlagert 'neues IdTag (..)' von Getter zum Eigentümer des Klassenkonstruktors. Vielen Dank. –

Verwandte Themen