2012-09-06 1 views
4

Ayant essayé de chercher avec différentes combinaisons de ".net désérialiser xml un type d'objet connu" ... et ne trouvant rien qui ait du sens, je suis là maintenant..net deserialize xml à l'un des multiples objets connus

Je reçois 1 des 5 objets indépendants (différents schémas pour chacun) qui peuvent m'être envoyés et j'ai besoin de désérialiser ce xml dans l'objet correct. Et bien sûr, le nombre/type d'objets va augmenter ;-) Y a-t-il un moyen pour le désérialiseur de faire correspondre le contenu xml à un objet, peut-être de réfléchir (juste deviner)? Je n'obtiens aucune enveloppe externe de xml autour de l'objet sérialisé me disant ce que c'est, autre que le contenu de xml lui-même. Ce sont des messages arrivant de différents systèmes me notifiant d'un événement, changement de statut, nouvel ordre, ...

Je pense à la force brute à ce stade, lecteur de xml à la recherche d'un attribut d'identification qui correspond de façon unique à un de mes connus éléments, puis passer de là à désérialiser en utilisant le type approprié. Cela ne semble pas trop élégant.

Toute orientation apprécié, G

Répondre

0

Utilisez les éléments suivants:

Stream xml; // Contains the XML to deserialize 
XmlSerializer xmlSerializer = new XmlSerializer(
    typeof(MyClass1), 
    new []{ typeof(MyClass2), typeof(MyClass3) }); // Add additional classes here 
object obj = xmlSerializer.Deserialize(xml); 

if(obj Is MyClass1) 
{ 
    // Do something 
} 
else if (obj is MyClass2) 
{ 
    // Do something 
} 
else if (obj is MyClass3) 
{ 
    // Do something 
} 
// And so on for other classes 
+0

Cela n'a pas fonctionné pour moi. Le premier paramètre de type passé dans le constructeur de XmlSerializer doit correspondre à l'élément racine du fichier XML. – Pradeep

+0

Je dois me corriger. Cela ne fonctionnera que si le premier paramètre est le même pour le sérialiseur et le désérialiseur. Par exemple, si le premier paramètre est typeof (Message), alors le xml sérialisé aura un élément racine . Si le XML est dans un schéma prédéfini et que vous n'avez aucun contrôle sur celui-ci, alors cela ne fonctionnera probablement pas pour vous. – Pradeep

0

Si le nom de l'élément racine XML (et/ou espace de noms) est différent pour chaque type d'objet, vous pouvez utiliser XmlSerializer.CanDeserialize à Vérifiez le nom de l'élément racine par rapport au schéma.

XmlSerializer appleSerializer = new XmlSerializer(typeof(Apple)); 
XmlSerializer bananaSerializer = new XmlSerializer(typeof(Banana)); 
XmlSerializer carrotSerializer = new XmlSerializer(typeof(Carrot)); 

XmlReader reader = XmlReader.Create(file); 

if (appleSerializer.CanDeserialize(reader)) 
{ 
    Apple a = (Apple)appleSerializer.Deserialize(reader); 
    // ... 
} 
else if (bananaSerializer.CanDeserialize(reader)) 
{ 
    Banana b = (Banana)bananaSerializer.Deserialize(reader); 
    // ... 
} 
else if (carrotSerializer.CanDeserialize(reader)) 
{ 
    Carrot c = (Carrot)carrotSerializer.Deserialize(reader); 
    // ... 
}