无法使用特定名称反序列化 属性

Unable to deserialize property with specific name

我在 C# 中使用 DataContractSerializer 将 xml 文件反序列化为对象,一切正常:)

当我向我的 class 和 xml 文件中添加新的 属性 时,我的问题就开始了。每次我反序列化文件时,我的新 属性 名称是 EncryptionKey,属性 值保持 null,但是当我更改 xml 元素和 [=43] 的名称时=] 到 anEncryptionKey 它正确反序列化而不更改代码中的任何其他内容。

实际上,我为 属性 名称尝试了很多选项,例如 EncryptKeyEncrypt 等等,但我最终选择了 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 class:

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

    public int HeartBeatInterval {get; set;}

    public string ServerURL {get; set;}

    public string EncryptionKey { get; set; }

 }

注意:以上代码可能包含一些语法错误,因为我对其进行了修改以使其简短。

您需要确保您的 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;
        }
    }
}

如果您需要保留特定顺序,请在 class 属性中指定 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; }
}