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