2017-04-27 56 views
1

自從我使用了DataContractSerializer以來,我已經有一段時間了,我在反序列化xml文件時遇到了一些麻煩。使用DataContractSerializer解析xml文件時出現的問題

<?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">

我得到的錯誤是:

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

我已經試過指定其中也不起作用的命名空間。

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

該文件的名稱空間最近已更改,並且該接口已添加到類中。我解決了所有其他問題,我似乎無法繞過這一問題。

我更喜歡使用DataContractSerializer的作爲類現在有接口的屬性和XMLSerializer的不會deserialise它

+0

由於錯誤信息是有關XML,請提供XML。 –

+0

爲什麼不使用'XmlSerializer',因爲它使事情變得更容易? –

+0

啊包含XML,但是從帖子中刪除,錯過了'code'標記 –

回答

2

This answer可以幫助你解決你的問題。

如果您喜歡使用XmlSerializer。這裏是下面的簡單實現:

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

我更喜歡使用DatacontractSerializer,因爲類現在具有接口屬性,並且XMLSerializer不會對其進行反序列化。 –

+1

管理得到此工作。這是我在嘗試'datacontractserializer'之前使用的解決方案。問題是接口。我將設計更改爲不使用可序列化類中的接口 –