2017-04-27 8 views
1

Cela fait longtemps que je n'ai pas utilisé DataContractSerializer et j'ai un peu de mal à désérialiser un fichier XML.Problème de désérialisation du fichier XML à l'aide de DataContractSerializer

<?xml version="1.0" encoding="utf-8"?> <SoftwareLicense xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">

L'erreur que je reçois est:

{"Error in line 1 position 117. Expecting element 'SoftwareLicense' from namespace 'http://schemas.datacontract.org/2004/07/Solentim.Modules.Licensing.Activation'.. Encountered 'Element' with name 'SoftwareLicense', namespace ''. "}

[DataContract(Name = "SoftwareLicense")] 
public class SoftwareLicense : ISoftwareLicense 
{ 
    ... 
} 

J'ai essayé spécifier l'espace de noms qui ne fonctionne pas non plus.

var serializer = new DataContractSerializer(typeof(SoftwareLicense)); 

using (var stream = new FileStream(filename, FileMode.Open, FileAccess.Read)) 
{ 
    using (var reader = 
       XmlDictionaryReader.CreateTextReader(stream, new XmlDictionaryReaderQuotas())) 
    { 
     return (SoftwareLicense) serializer.ReadObject(reader); 
    } 
} 

L'espace de noms du fichier a récemment été modifié et une interface a été ajoutée à la classe. J'ai résolu tous les autres problèmes que je n'arrive pas à contourner celui-ci.

Je préfère utiliser DataContractSerializer que la classe a maintenant des propriétés d'interface et XMLSerializer ne sera pas deserialise il

+0

Puisque le message d'erreur est lié au fichier XML, veuillez fournir le fichier XML. –

+0

Pourquoi n'utilisez-vous pas XmlSerializer, car cela rend les choses beaucoup plus faciles? –

+0

Ah le XML a été inclus mais a été retiré de la publication, manqué la balise 'code' –

Répondre

2

This answer peut vous aider à résoudre votre problème.

Si vous préférez utiliser XmlSerializer. Voici la mise en œuvre simple ci-dessous:

private T Deserialize<T>(string path) where T : class 
{ 
    XmlSerializer serializer = new XmlSerializer(typeof(T)); 
    T result = null; 
    using (XmlReader reader = XmlReader.Create(path)) 
    { 
     result = (T)serializer.Deserialize(reader); 
    } 
    return result; 
} 
+0

Je préfère utiliser le DatacontractSerializer car la classe a maintenant des propriétés d'interface et XMLSerializer ne le désérialisera pas –

+1

Géré pour obtenir ce travail. C'était la solution que j'utilisais avant d'essayer 'datacontrerserializer'. Le problème était les interfaces. J'ai changé la conception pour ne pas utiliser d'interfaces dans la classe sérialisable –