代码之家  ›  专栏  ›  技术社区  ›  Sarah Vessels

在可序列化C类上使用不带xmlaray的xmlarayitem属性

  •  46
  • Sarah Vessels  · 技术社区  · 14 年前

    我希望XML采用以下格式:

    <configuration><!-- Only one configuration node -->
      <logging>...</logging><!-- Only one logging node -->
      <credentials>...</credentials><!-- One or more credentials nodes -->
      <credentials>...</credentials>
    </configuration>
    

    我正在创建一个类 Configuration 那有 [Serializable] 属性。要序列化凭据节点,我有以下功能:

    [XmlArray("configuration")]
    [XmlArrayItem("credentials", typeof(CredentialsSection))]
    public List<CredentialsSection> Credentials { get; set; }
    

    但是,当我将其序列化为XML时,XML的格式如下:

    <configuration>
      <logging>...</logging>
      <configuration><!-- Don't want credentials nodes nested in a second
                          configuration node -->
        <credentials>...</credentials>
        <credentials>...</credentials>
      </configuration>
    </configuration>
    

    如果我删除 [XmlArray("configuration")] 行,我得到以下信息:

    <configuration>
      <logging>...</logging>
      <Credentials><!-- Don't want credentials nodes nested in Credentials node -->
        <credentials>...</credentials>
        <credentials>...</credentials>
      </Credentials>
    </configuration>
    

    我如何用我想要的方式序列化这个,用多个 <credentials> 单个根节点内的节点 <configuration> ?我想在不需要执行的情况下完成这个任务 IXmlSerializable 并进行自定义序列化。我的课是这样描述的:

    [Serializable]
    [XmlRoot("configuration")]
    public class Configuration : IEquatable<Configuration>
    
    1 回复  |  直到 14 年前
        1
  •  72
  •   Mikael Svenson    14 年前

    以下内容应按您希望的方式正确序列化。线索正在 [XmlElement("credentials")] 名单上。我是通过使用您的XML,在Visual Studio中从中生成一个模式(XSD)来实现这一点的。然后在架构上运行xsd.exe以生成类。(和一些小的编辑)

    public class CredentialsSection
    {
        public string Username { get; set; }
        public string Password { get; set; }
    }
    
    [XmlRoot(Namespace = "", IsNullable = false)]
    public class configuration
    {
        /// <remarks/>
        public string logging { get; set; }
    
        /// <remarks/>
        [XmlElement("credentials")]
        public List<CredentialsSection> credentials { get; set; }
    
        public string Serialize()
        {
            var credentialsSection = new CredentialsSection {Username = "a", Password = "b"};
            this.credentials = new List<CredentialsSection> {credentialsSection, credentialsSection};
            this.logging = "log this";
            XmlSerializer s = new XmlSerializer(this.GetType());
            StringBuilder sb = new StringBuilder();
            TextWriter w = new StringWriter(sb);
            s.Serialize(w, this);
            w.Flush();
            return sb.ToString();
        }
    }
    

    给出以下输出

    <?xml version="1.0" encoding="utf-16"?>
    <configuration xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <logging>log this</logging>
      <credentials>
        <Username>a</Username>
        <Password>b</Password>
      </credentials>
      <credentials>
        <Username>a</Username>
        <Password>b</Password>
      </credentials>
    </configuration>