2009-11-17 4 views
1

Si j'ai 10 objets différents sérialisés/désérialisés en utilisant une classe T générique qui utilise le XmlSerializer en interne, comment savoir quel type utiliser lors de la désérialisation?Comment déterminer le type lors de la désérialisation?

MyXmlSerializer.Deserialize<MyObject> (...) 

Comment puis-je connaître MyObject? Tout ce que j'ai est un stringstream.

Répondre

3

Vous pouvez mettre en œuvre une méthode statique pour essayer de désérialiser chaque type possible. De cette façon, vous n'aurez pas à casser votre modèle d'objet pour prendre en charge la découverte de type à l'exécution.

Vous devriez toujours avoir quelques suppositions pour les types stockés dans le fichier XML. La sérialisation du fichier XML simle ne stocke pas les informations de type détaillées par défaut. Il semble qu'il devrait y avoir un attribut qui oblige le sérialiseur à stocker le nom de type détaillé, mais je ne l'ai pas trouvé ...

public static bool TryDeserialize<T>(XmlReader reader, out T obj) where T : class 
{ 
    // Return null, if we can't deserialize 
    obj = null; 

    XmlSerializer deserializer = new XmlSerializer(typeof(T)); 
    bool result = deserializer.CanDeserialize(reader); 

    if (result) 
    { 
     // Get the object, if it's possible 
     obj = deserializer.Deserialize(reader) as T; 
    } 
    return result; 
} 
+0

Vous n'avez pas besoin d'attribut, il vous suffit de transmettre les types connus au ctor du XmlSerializer. –

+0

J'ai vu votre solution. Vous aurez toujours besoin de savoir quel type vous avez, c'est-à-dire if (res.GetType() == typeof (Tst1)). Je pense qu'il est tout aussi facile d'utiliser la méthode de type safe ci-dessus, qui est similaire à la syntaxe .Parse (..). Si vous n'avez pas besoin de savoir quel type a été désérialisé, votre méthode a plus de sens. –

2

Vous pouvez utiliser des types connus:

var ttt = new []{typeof(Tst1), typeof(Tst2)}; 
var ser = new XmlSerializer(typeof(object), ttt); 

// STEP 1 
ser.Serialize(File.CreateText("D:\\test.xml"), new Tst2()); 

// STEP 2 
var res = ser.Deserialize(File.OpenText("D:\\test.xml")); 

Console.WriteLine(res); 
Questions connexes