2011-11-21 13 views
13

Używam XmlSerializer do komunikacji z usługą. To nie jest zwykła usługa SOAP, ma ona własne typy obiektów XML. Na przykład mogę poprosić o obiekt <Capabilities>, ale może on zwrócić wartość <Exception>. Innymi słowy, mam do czynienia z przypadkowymi typami dokumentów XML. Jednak wiem, z którymi typami mam do czynienia.Deserializuj losowe/nieznane typy za pomocą XmlSerializer

Co próbuję zrobić, to znaleźć ogólne podejście do serializacji/deserializacji tych dokumentów. Problem polega na tym, że XmlSerializer musi znać typ na etapie tworzenia.

te nie są zamknięte we wspólnej elementu głównego, więc dokonując klasy bazowej i przy użyciu atrybutu [XmlInclude] nie działa w tym przypadku:

[XmlInclude(typeof(Exception))] 
[XmlInclude(typeof(Capabilities))] 
public abstract class BaseClass 
{ 
    public BaseClass() 
    { 
    SchemaLocation = "test"; 
    } 

    [XmlAttribute("schemaLocation")] 
    public String SchemaLocation { get; set; } 
} 

[XmlRoot("Exception")] 
public class Exception : BaseClass 
{ 
    public Exception():base() 
    { 
    } 
    [XmlElement] 
    public String Message { set; get; } 
} 

[XmlRoot("Capabilities")] 
public class Capabilities : BaseClass 
{ 
    public Capabilities() : base() 
    {} 
    [XmlElement] 
    public String ServiceName { set; get; } 
} 

Moje rozwiązanie tak daleko jest do sondowania element główny ręcznie XmlReader, a następnie zamapuj go na poprawny typ przed utworzeniem instancji XmlSerializer.

Czy istnieje lepszy sposób na zrobienie tego?

+0

Myślę, że twoja droga jest w porządku. XmlSerializer nie odtwarza się bardzo dobrze w przypadku modeli, które opisujesz. istnieją pewne sztuczki, aby zrobić to bardziej ogólnie, ale zależą one od twojej 'BaseClass' zamkniętej w głównym elemencie. Możesz ewentualnie dodać ten element główny do swojego xml, a następnie zastosować tę metodę lub użyć XmlInclude. zobacz http://www.codeproject.com/KB/XML/xmlserializerforunknown.aspx – wal

Odpowiedz

1

Jak już wspomniano, kiedy można zażądać zwrotu usługi. Czy wiesz, że jeśli zostanie złożony wniosek dotyczący typu, usługa może zwrócić tylko niektóre typy z powrotem?

Spróbowałbym XmlSerializer Constructor (Type, Type[]) ... Inicjuje nowe wystąpienie klasy XmlSerializer, które może serializować obiekty określonego typu do dokumentów XML i deserializować dokumenty XML do obiektu określonego typu. Jeśli właściwość lub pole zwraca tablicę, parametr extraTypes określa obiekty, które można wstawić do tablicy.

+1

To jest poprawne, mogę wykluczyć niektóre typy z powrotem, 3-4 typy differnet. Próbowałem konstruktora z (Type, Type []) bez powodzenia .. jest to faktycznie tak samo jak przy użyciu XmlIncludeAttribute. – Oyvind

Powiązane problemy