Comment désérialiser le XML sans connaître le type à l'avance?

Dire que j'ai un couple d'objets de base comme:

[Serializable]
public class Base
{

    public string Property1 { get; set; }
    public int Property2 { get; set; }
}

[Serializable]
public class Sub: Base
{
    public List<string> Property3 { get; set; }

    public Sub():base()
    {
        Property3 = new List<string>();
    }        
}

Et je sérialiser eux comme suit:

Sub s = new Sub {Property1 = "subtest", Property2 = 1000};
s.Property3.Add("item 1");
s.Property3.Add("item 2");

XmlSerializer sFormater = new XmlSerializer(typeof(Sub));
using (FileStream fStream = new FileStream("SubData.xml", 
    FileMode.Create, FileAccess.Write, FileShare.None))
{
    sFormater.Serialize(fStream, s);
}

Comment puis-je désérialiser, de sorte que je serai de retour la classe correcte?

Comme dans, je veux quelque chose de ce genre

XmlSerializer bFormater = new XmlSerializer(typeof (Base));
Base newBase;
using (FileStream fStream = new FileStream("BaseData.xml", 
    FileMode.Open, FileAccess.Read, FileShare.Read))
{
    newBase = (Base) bFormater.Deserialize(fStream);
}

Sauf que je serais capable de passer d'un fichier XML pour toute la classe qui descend à partir de la Base et la classe correcte serait créé.

Je suis en train de penser que je puisse lire le nom du nœud racine du document XML et l'utilisation d'une instruction switch pour créer le bon XmlSerializer, mais je me demandais si il y avait un moyen plus simple.

source d'informationauteur Ray