2011-11-21 13 views
13

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?

+0

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

risposta

1

Come hai detto quando hai richiesto il servizio potrebbe restituire. Quindi sai se viene fatta una richiesta per un tipo, allora il servizio potrebbe restituire solo alcuni tipi?

avrei provato XmlSerializer Constructor (Type, Type[]) ... Inizializza una nuova istanza della classe XmlSerializer che può serializzare gli oggetti del tipo specificato in documenti XML, e deserializzare documenti XML in oggetti di un tipo specificato. Se una proprietà o un campo restituisce una matrice, il parametro extraTypes specifica gli oggetti che possono essere inseriti nella matrice.

+1

Quello è corretto, posso excpect alcuni tipi indietro, i suoi tipi di differnet 3-4. Ho provato costruttore con (Tipo, Tipo []) senza fortuna .. in realtà è lo stesso che usare XmlIncludeAttribute. – Oyvind

Problemi correlati