c# - C# - KeyValueConfigurationCollection 的 Xml 反序列化
问题描述
我有一个 C# 应用程序。在这个应用程序中,我有一些如下所示的 XML:
string xml = @"<list name=""Groceries"">
<add key=""1"" value=""Milk"" />
<add key=""2"" value=""Eggs"" />
<add key=""3"" value=""Bread"" />
</list>";
我正在尝试将此 XML 转换为 C# 对象。我的班级看起来像这样:
public class List : ConfigurationElement, IXmlSerializable
{
[ConfigurationProperty("name", IsRequired = true, IsKey = true, DefaultValue = "")]
public string Name
{
get { return (string)(this["name"]); }
set { this["name"] = value; }
}
[ConfigurationProperty("", IsRequired = false, IsKey = false,
IsDefaultCollection=true)]
public KeyValueConfigurationCollection Items
{
get
{
var items = base["items"] as KeyValueConfigurationCollection;
return items;
}
set
{
if (base.Properties.Contains("items"))
{
base["items"] = value;
}
else
{
var configProperty = new ConfigurationProperty("items", typeof(KeyValueConfigurationCollection), value);
base.Properties.Add(configProperty);
}
}
}
public XmlSchema GetSchema()
{
return this.GetSchema();
}
public void ReadXml(XmlReader reader)
{
this.DeserializeElement(reader, false);
}
public void WriteXml(XmlWriter writer)
{
this.SerializeElement(writer, false);
}
public static List Deserialize(string xml)
{
List list= null;
var serializer = new XmlSerializer(typeof(List));
using (var reader = new StringReader(xml))
{
list = (List)(serializer.Deserialize(reader));
}
return list;
}
}
当我跑步时,var list = List.Deserialize(xml);
我得到一个List
对象。名称List
设置正确。但是,Items
属性是null
。为什么不Items
反序列化?如何Items
使用列出的键/值对填充?
谢谢
解决方案
看起来与之前的问题重复。
以下是更正:
- 从 getter 中删除“项目”,否则会抛出
System.Configuration.ConfigurationErrorsException:'属性'项目'不得从属性的 get 方法返回 null。通常,getter 应该返回 base[""]。'
get
{
var items = base[""] as KeyValueConfigurationCollection;
return items;
}
- 更新了具有 root 属性的序列化程序:
public static List Deserialize(string xml)
{
var serializer = new XmlSerializer(typeof(List), new XmlRootAttribute("list"));
List list = null;
var xdoc = XDocument.Parse(xml);
list = (List)serializer.Deserialize(xdoc.CreateReader());
return list;
}
最终版本现在如下:
public class List : ConfigurationElement, IXmlSerializable
{
public List()
{ }
[ConfigurationProperty("name", IsRequired = true, IsKey = true, DefaultValue = "")]
public string Name
{
get { return (string)(this["name"]); }
set { this["name"] = value; }
}
[ConfigurationProperty("", IsRequired = false, IsKey = false,
IsDefaultCollection = true)]
public KeyValueConfigurationCollection Items
{
get
{
var items = base[""] as KeyValueConfigurationCollection;
return items;
}
set
{
if (base.Properties.Contains("items"))
{
base["items"] = value;
}
else
{
var configProperty = new ConfigurationProperty("items", typeof(KeyValueConfigurationCollection), value);
base.Properties.Add(configProperty);
}
}
}
public XmlSchema GetSchema()
{
return this.GetSchema();
}
public void ReadXml(XmlReader reader)
{
this.DeserializeElement(reader, false);
}
public void WriteXml(XmlWriter writer)
{
this.SerializeElement(writer, false);
}
public static List Deserialize(string xml)
{
List list = null;
var serializer = new XmlSerializer(typeof(List), new XmlRootAttribute("list"));
var xdoc = XDocument.Parse(xml);
list = (List)serializer.Deserialize(xdoc.CreateReader());
return list;
}
}
推荐阅读
- python - 如何在群组中电报自动发帖机器人?
- javascript - 传入流未显示 PeerJs
- logging - 在苹果 m1 ARM 上安装 logstash
- python - 在 django rest 框架(使用 TokenAuthentication)公共 APIView 上获取 CSRF 令牌丢失错误
- php - 范围控制 dec 到具有特定范围的十六进制
- python - 即使某些单元格是数字,Gspread 也会从名为 range 的 Google Sheet 中检索所有字符串
- python - python:backtrace.hook 不适用于 backtrace.print_exc()
- c - 使用 open() 和 read() 在 C 中打印文件的前 10 行
- r - 如何使用 knnreg 功能?
- android - 即使在压力下,如何保持前台服务的活力?