2015-06-25 23 views
7

uzyskaćJak przekonwertować atrybut XML do niestandardowego obiektu podczas deserializacji w C# za pomocą XmlSerializer

InvalidCastException: Wartość nie jest zamienny obiektu: system.string do IdTag

podczas próby deserializować atrybut xml.

Poniżej xml próbki:

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

Przykładowe klas:

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

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

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

jest wyjątek od Convert.ToType() metody (który nazywa się z XmlSerializer). AFAIK nie ma sposobu na "implementację" interfejsu IConvertible dla System.String do konwersji na IdTag. Wiem, że mogę zaimplementować właściwość proxy, to jest:

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; } 
    } 
} 

Czy istnieje inny sposób?

Odpowiedz

2

Musisz powiedzieć XmlSerializer jaki ciąg znaków musi szukać w twoim obiekcie IdTag. Przypuszczalnie istnieje właściwość tego obiektu, który chcesz serializować (nie cały obiekt).

Tak, można to zmienić:

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

do tego:

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

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

zauważyć różnicę między tym i co pisał - kiedy deserializowania to Twój ParentIdTag obiekt proxy powinny być właściwie zainicjowany.

+0

Zdecydowanie ulepszenie - przenosi 'nowy IDTag (..)' z gettera na własny konstruktor klasy. Dzięki. –

Powiązane problemy