Sto usando XmlSerializer per comunicare con un servizio. Questo non è un normale servizio SOAP, ha i propri tipi di oggetto XML. Ad esempio, potrei chiedere un oggetto <Capabilities>
, ma potrebbe restituire un <Exception>
. Quindi, in altre parole, devo trattare con tipi di documenti XML casuali. Tuttavia, so quali sono i tipi con cui ho a che fare.Deserializzare i tipi casuali/sconosciuti con XmlSerializer
Quello che sto cercando di fare è trovare un approccio generico per serializzare/deserializzare questi documenti. Il problema è che XmlSerializer deve conoscere il tipo nella fase di creazione.
Questi non sono incapsulati in un elemento radice comune, in modo da rendere la classe base e utilizzando l'attributo [XmlInclude]
non funziona in questo caso:
[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; }
}
mia soluzione finora è quello di sondare l'elemento radice manualmente con XmlReader, quindi associarlo al tipo corretto prima di creare un'istanza XmlSerializer.
C'è un modo migliore per farlo?
Penso che il tuo modo sia ok. XmlSerializer non funziona molto bene per modelli come quelli che stai descrivendo. ci sono alcuni trucchi per farlo in modo più generico ma dipendono dal fatto che il tuo 'BaseClass' venga incapsulato in un elemento radice. È possibile aggiungere questo elemento radice attorno al proprio xml e quindi applicare questo metodo o utilizzare XmlInclude. vedi http://www.codeproject.com/KB/XML/xmlserializerforunknown.aspx – wal