代码之家  ›  专栏  ›  技术社区  ›  user687554

C-keyValueConfigurationCollection的XML反序列化

  •  5
  • user687554  · 技术社区  · 7 年前

    我有一个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 对象返回。的名称 设置正确。但是, Items 属性为 null . 为什么不是 项目 正在进行反序列化?我怎么得到 项目 是否用列出的键/值对填充?

    谢谢你

    1 回复  |  直到 7 年前
        1
  •  3
  •   d.stack    7 年前

    看起来和以前一样 question .

    以下是更正:

    • 从getter中删除“items”,否则它将抛出

    system.configuration.configurationErrorException:“属性”items“不能从属性的get方法返回空值。”通常getter应返回base[“”]。

    get
            {
                var items = base[""] as KeyValueConfigurationCollection;
                return items;
            }
    
    • 已更新具有根属性的序列化程序:

    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;
        }
    }