无法使用特定名称反序列化 属性
Unable to deserialize property with specific name
我在 C# 中使用 DataContractSerializer
将 xml 文件反序列化为对象,一切正常:)
当我向我的 class 和 xml 文件中添加新的 属性 时,我的问题就开始了。每次我反序列化文件时,我的新 属性 名称是 EncryptionKey
,属性 值保持 null
,但是当我更改 xml 元素和 [=43] 的名称时=] 到 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 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; }
}
我在 C# 中使用 DataContractSerializer
将 xml 文件反序列化为对象,一切正常:)
当我向我的 class 和 xml 文件中添加新的 属性 时,我的问题就开始了。每次我反序列化文件时,我的新 属性 名称是 EncryptionKey
,属性 值保持 null
,但是当我更改 xml 元素和 [=43] 的名称时=] 到 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 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; }
}