2010-03-26 35 views
2

我有一個XML文件,我試圖序列化成一個對象。有些元素被忽略。數據合同序列化不適用於所有元素

我的XML文件:

<?xml version="1.0" encoding="utf-8" ?> 
<License xmlns="http://schemas.datacontract.org/2004/07/MyApp.Domain"> 
<Guid>7FF07F74-CD5F-4369-8FC7-9BF50274A8E8</Guid> 
<Url>http://www.gmail.com</Url> 
<ValidKey>true</ValidKey> 
<CurrentDate>3/1/2010 9:39:28 PM</CurrentDate> 
<RegistrationDate>3/8/2010 9:39:28 PM</RegistrationDate> 
<ExpirationDate>3/8/2099 9:39:28 PM</ExpirationDate> 
</License> 

我的類定義:

[DataContract] 
public class License 
{ 
    [DataMember] 
    public virtual int Id { get; set; } 
    [DataMember] 
    public virtual string Guid { get; set; } 
    [DataMember] 
    public virtual string ValidKey { get; set; } 
    [DataMember] 
    public virtual string Url { get; set; } 
    [DataMember] 
    public virtual string CurrentDate { get; set; } 
    [DataMember] 
    public virtual string RegistrationDate { get; set; } 
    [DataMember] 
    public virtual string ExpirationDate { get; set; } 
} 

我的序列化的嘗試:

XmlDocument Xmldoc = new XmlDocument(); 
Xmldoc.Load(string.Format(url)); 

string xml = Xmldoc.InnerXml; 
var serializer = new DataContractSerializer(typeof(License)); 
var memoryStream = new MemoryStream(Encoding.UTF8.GetBytes(xml)); 
License license = (License)serializer.ReadObject(memoryStream); 
memoryStream.Close(); 

下列元素序列:

  • 的Guid
  • ValidKey

以下元素不是序列:

  • 地址
  • 的currentdate
  • RegistrationDate
  • 到期日期

用「blah」替換xml文件中的字符串日期也不起作用。是什麼賦予了?

+0

順便說一句,反序列化'XmlDoc.CreateNavigator()。ReadSubtree()'可能會更快。這將在您的文檔上返回一個XmlReader。 – 2010-03-26 20:15:33

+0

謝謝約翰,我會檢查一下! – splatto 2010-03-26 20:18:04

回答

5

DataContractSerializer要求表示屬性的XML元素按字母順序排列。所以,你的XML應該是:

<?xml version="1.0" encoding="utf-8" ?> 
<License xmlns="http://schemas.datacontract.org/2004/07/MyApp.Domain"> 
    <CurrentDate>3/1/2010 9:39:28 PM</CurrentDate> 
    <ExpirationDate>3/8/2099 9:39:28 PM</ExpirationDate> 
    <Guid>7FF07F74-CD5F-4369-8FC7-9BF50274A8E8</Guid> 
    <RegistrationDate>3/8/2010 9:39:28 PM</RegistrationDate> 
    <Url>http://www.gmail.com</Url> 
    <ValidKey>true</ValidKey> 
</License> 

正如約翰指出的那樣,例外是如果你在你的DataMember屬性上使用Order屬性。在這種情況下,XML元素必須按照指定的順序。

+0

@Aaron:感謝提到字母順序。我不知道。我建議你在你的答案中加入'Order'屬性。 – 2010-03-26 20:10:59

+0

嗨,約翰 - 爲了回答你最初的問題,我試着重新排列它們。我已經使用了Aaron的解決方案,並且還添加了Order屬性,以幫助在未來無意中破壞某人的編輯。 謝謝你們倆 – splatto 2010-03-26 20:17:26

相關問題