2016-11-24 61 views
0

我使用DataContractSerializer在C#中反序列化XML文件轉換成對象,一切都反序列化屬性是工作的罰款:)無法與特定名稱

我的問題開始時,我添加一個新的屬性,以我的等級和XML文件。每次我反序列化文件時,我的新屬性名稱是EncryptionKey,屬性值仍爲null,但是當我將xml元素和屬性的名稱更改爲anEncryptionKey時,它正確反序列化而不更改代碼中的任何其他內容。

其實我嘗試了很多屬性名稱的選項,如EncryptKey,Encrypt和更多,但我最終以anEncryptionKey結束。

也許有一些屬性名稱或類似的東西,或者我只需要更多的咖啡因來解決它。

XML文件:

<?xml version="1.0" encoding="utf-8" ?> 
<KioskSettings xmlns="http://schemas.datacontract.org/2004/07/Proxies" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
    <ID>20198</ID> 
    <HeartBeatInterval>1</HeartBeatInterval> 
    <ServerURL></ServerURL> 
    <EncryptionKey>abcd</EncryptionKey> 
</KioskSettings> 

代碼,我用它來反序列化的文件轉換成目標:

private KioskSettings ReadEngineSettingsFromSimulatorXmlFile() 
{ 
    KioskSettings engineSettings = new KioskSettings(); 
    DataContractSerializer serializer = new DataContractSerializer(typeof(KioskSettings)); 
    FileStream fs = new FileStream(@"c:\simulation.xml", FileMode.Open); 
    XmlDictionaryReader reader = XmlDictionaryReader.CreateTextReader(fs, new XmlDictionaryReaderQuotas()); 
    while (reader.Read()) 
    { 
     switch (reader.NodeType) 
     { 
      case XmlNodeType.Element: 
       if (serializer.IsStartObject(reader)) 
       { 
        engineSettings = (KioskSettings)serializer.ReadObject(reader); 
       } 
       break; 
     } 
    } 

    fs.Flush(); fs.Close(); 
    reader.Close(); 
    reader = null; 
    serializer = null; 
    return engineSettings; 
} 

KioskSettings類:

public class KioskSettings 
{ 
    public string ID { get; set; } 

    public int HeartBeatInterval {get; set;} 

    public string ServerURL {get; set;} 

    public string EncryptionKey { get; set; } 

} 

注:以上代碼可能包含一些語法錯誤,因爲我修改它使其縮短。

+0

嘗試添加[數據成員] :) –

+0

謝謝你的快速回復,實際上反序列化是除「EncryptionKey設置」所有其他屬性工作正常,無添加「[數據成員]」屬性,當我把它添加到「EncryptionKey設置'屬性只有它已被正確反序列化,但是當我將其添加到剩餘的屬性時,不幸的是它不會再反序列化。 – Ebraheem

回答

1

你需要確保你的XML節點是按字母順序排列:

<?xml version="1.0" encoding="utf-8" ?> 
<KioskSettings xmlns="http://schemas.datacontract.org/2004/07/Proxies" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
    <EncryptionKey>abcd</EncryptionKey> 
    <HeartBeatInterval>1</HeartBeatInterval> 
    <ID>20198</ID> 
    <ServerURL></ServerURL> 
</KioskSettings> 

序列化KioskSettings用下面的代碼對象,並確保您的XML採用相同的形式:

public static string DataContractSerializeObject<T>(T objectToSerialize) 
{ 
    using (MemoryStream memStm = new MemoryStream()) 
    { 
     var serializer = new DataContractSerializer(typeof(T)); 
     serializer.WriteObject(memStm, objectToSerialize); 

     memStm.Seek(0, SeekOrigin.Begin); 

     using (var streamReader = new StreamReader(memStm)) 
     { 
      string result = streamReader.ReadToEnd(); 
      return result; 
     } 
    } 
} 

如果您需要保留特定的訂單,然後在您的類屬性上指定DataMember屬性 - 例如Data Member Order

[DataContract] 
public class KioskSettings 
{ 
    [DataMember(Order = 1)] 
    public string ID { get; set; } 

    [DataMember(Order = 2)] 
    public int HeartBeatInterval { get; set; } 

    [DataMember(Order = 3)] 
    public string ServerURL { get; set; } 

    [DataMember(Order = 4)] 
    public string EncryptionKey { get; set; } 
} 
+0

謝謝你的代碼示例,但我認爲上面的代碼用於序列化,我只有反序列化時遇到問題。我不需要序列化到文件中,因爲它將被手動編輯,因爲文件僅用於模擬目的。 – Ebraheem

+0

好的,然後只需在我的答案底部指定DataMember屬性即可。查看文檔鏈接以獲取更多詳細信息。 – openshac

+0

我會檢查文檔,但我之前嘗試DataMember屬性,它不能解決問題 – Ebraheem