2016-11-24 65 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