In C#, come si usa un XmlSerializer
per deserializzare un oggetto che potrebbe essere di una classe base o di una qualsiasi delle varie classi derivate senza conoscere preventivamente il tipo?Come si utilizza un XmlSerializer per deserializzare un oggetto che potrebbe essere di una classe base o derivata senza conoscere preventivamente il tipo?
Tutte le mie classi derivate aggiungono membri dati aggiuntivi. Ho creato una semplice GUI che può serializzare e deserializzare oggetti di classe. Serializzerà gli oggetti come qualsiasi classe ereditata (o anche solo la classe base) è appropriata in base ai campi che l'utente sceglie di popolare.
Non ho problemi con la serializzazione; il problema è la deserializzazione. Come posso avere i dati deserialize XmlSerializer
nella classe derivata corretta senza conoscere la classe in anticipo? Attualmente creo un XmlReader
per leggere il primo nodo del file XML e determinare la classe da esso, e sembra funzionare per i miei scopi, ma sembra una soluzione estremamente inelegante.
Ho inserito qualche codice di esempio qui sotto. Eventuali suggerimenti?
BaseType objectOfConcern = new BaseType();
XmlSerializer xserializer;
XmlTextReader xtextreader = new XmlTextReader(DEFAULT_FILENAME);
do { xtextreader.Read(); } while (xtextreader.NodeType != XmlNodeType.Element);
string objectType = xtextreader.Name;
xtextreader.Close();
FileStream fstream = new FileStream(DEFAULT_FILENAME, FileMode.Open);
switch (objectType)
{
case "type1":
xserializer = new XmlSerializer(typeof(DerivedType));
objectOfConcern = (DerivedType)xserializer.Deserialize(fstream);
//Load fields specific to that derived type here
whatever = (objectOfConcern as DerivedType).NoOfstreamubordinates.ToString();
case "xxx_1":
//code here
case "xxx_2":
//code here
case "xxx_n":
//code here
//and so forth
case "BaseType":
xserializer = new XmlSerializer(typeof(BaseType));
AssignEventHandler(xserializer);
objectOfConcern = (BaseType)xserializer.Deserialize(fstream);
}
//Assign all deserialized values from base class common to all derived classes here
//Close the FileStream
fstream.Close();
Very cool, grazie! –