2012-05-22 4 views
0

Désolé pour un titre merdique. N'hésitez pas à le changer pour un meilleur.XML désérialisation d'objets faiblement typés dans .NET

Le problème est le suivant: j'ai besoin de lire un ensemble de fichiers XML qui ressemblent à ceci:

<rootElement> 
    <header> 
     <!-- some stuff here --> 
    </header> 
    <businessContent> 
     <oneOfSeveralAllowedSubNodesHereLikeCustomer /> 
    <businessContent> 
</rootElement> 

Je suis xsd.exe pour générer des classes C# à partir d'un fichier de schéma que j'ai et il fait comme ça (simplifié):

public class rootElement 
{ 
    public header header {get;set;} 
    public object businessContent {get;set;} 
} 
// other classes like header and classes for the values 
// allowed within business content, say customer 

Notez que le type de businessContent est System.Object qui est assez juste. Le schéma ne dit rien explicitement de ce qui peut réellement être mis là. Mais j'ai un fichier xml qui a un customer l'intérieur de son businessContent. le client est défini dans le xsd et le xsd.exe a généré une classe pour cela aussi. Je me attends à une instance de cette classe à créer et mettre mon businessContent mais quand je lis le XML:

var serializer = new XmlSerializer(typeof(rootElement)); 
var root = (rootElement)serializer.Deserialize(stream)); 
var customer = (customer)root.businessContent; 

-je obtenir une exception, car le type de root.businessContent est XmlNode[] et non customer.

Alors, comment puis-je faire le sérialiseur pour désérialiser complètement mon objet, c'est-à-dire avec customer et non XmlNode[] à l'intérieur?

Répondre

1

Serializing and restoring an unknown class

var extraTypes = new[] { typeof(customer), typeof(otherAllowedSubnodeTypes) }; 
var serializer = new XmlSerializer(typeof(rootElement), extraTypes); 
+0

Cette exception se retrouve dans se plaignant que le client de type anonyme ne peut pas être utilisé ici – kko

+0

Est-ce une erreur de compilation ou d'une exception d'exécution? Pouvez-vous nous donner le message d'erreur exact? 'client' n'est pas un type anonyme, donc je ne comprends pas ce que vous avez dit. –

+0

il a [System.Xml.Serialization.XmlTypeAttribute (AnonymousType = true)] – kko