2017-04-27 3 views
1

Es ist eine Weile her, seit ich DataContractSerializer verwendet habe und ich habe ein wenig Probleme deserializing eine XML-Datei.Problem Deserialisieren XML-Datei mit 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">

Der Fehler ich erhalte ist:

{"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 
{ 
    ... 
} 

Ich habe versucht, den Namespace anzugeben, das auch nicht funktioniert.

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); 
    } 
} 

Der Namespace der Datei wurde kürzlich geändert und eine Schnittstelle zur Klasse hinzugefügt. Ich habe alle anderen Probleme gelöst, die ich einfach nicht umgehen kann.

Ich ziehe den DataContractSerializer zu verwenden, da die Klasse jetzt Schnittstelle Eigenschaften und XMLSerializer nicht deserialise es

+0

Da die Fehlermeldung auf die XML bezieht, geben Sie bitte die XML. –

+0

Warum verwenden Sie 'XmlSerializer' nicht, da es die Dinge viel einfacher macht? –

+0

Ah die XML wurde enthalten, wurde aber aus dem Beitrag entfernt, verpasste die 'code' Tag –

Antwort

2

This answer kann Ihnen helfen, Ihr Problem zu lösen.

Wenn Sie es vorziehen, XmlSerializer zu verwenden. Hier ist die einfache Implementierung unten:

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

Ich bevorzuge die DatacontractSerializer wie die Klasse jetzt hat Schnittstelleneigenschaften und XMLSerializer wird es nicht deserialisieren –

+1

Managed, um diese Arbeit zu bekommen. Dies war die Lösung, die ich benutzte, bevor ich 'datacontractserializer' versuchte. Das Problem waren die Schnittstellen. Ich habe den Entwurf geändert, um keine Schnittstellen in der serialisierbaren Klasse zu verwenden –

Verwandte Themen