2015-06-25 7 views
7

ottengoCome convertire attributo XML per oggetto personalizzato durante la deserializzazione in C# utilizzando XmlSerializer

InvalidCastException: Il valore non è un oggetto convertibile: System.String per IdTag

durante il tentativo deserializzare l'attributo xml.

Ecco il XML di esempio:

<?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> 

classi campione:

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

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

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

L'eccezione viene generata da Convert.ToType() metodo (che viene chiamato da XmlSerializer). AFAIK non è possibile "implementare" l'interfaccia IConvertible per System.String per convertire in IdTag. So che posso implementare una proprietà proxy i.e:

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

    [XmlAttribute("ParentId")] 
    public string _ParentId { get; set; } 

    [XmlIgnore] 
    public IdTag ParentId 
    { 
     get { return new IdTag(_ParentId); } 
     set { _ParentId = value.id; } 
    } 
} 

C'è qualche altro modo?

risposta

2

Devi dire allo XmlSerializer quale stringa deve cercare nell'oggetto IdTag. Presumibilmente, c'è una proprietà di quell'oggetto che vuoi serializzato (non l'intero oggetto).

Quindi, si potrebbe cambiare questo:

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

a questo:

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

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

nota la differenza tra questo e quello che hai postato - quando si deserializzare questo, il vostro oggetto proxy ParentIdTag dovrebbe essere adeguatamente inizializzato.

+0

Definitivamente un miglioramento - sposta 'new IdTag (..)' da getter a possedere il costruttore di classi. Grazie. –