在Serializable C#类上使用XmlArrayItem属性而不使用XmlArray

Sar*_*els 48 c# xml xml-serialization serializable xml-deserialization

我想要XML格式如下:

<configuration><!-- Only one configuration node -->
  <logging>...</logging><!-- Only one logging node -->
  <credentials>...</credentials><!-- One or more credentials nodes -->
  <credentials>...</credentials>
</configuration>
Run Code Online (Sandbox Code Playgroud)

我正在尝试创建一个Configuration具有该[Serializable]属性的类.要序列化凭据节点,我有以下内容:

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

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

<configuration>
  <logging>...</logging>
  <configuration><!-- Don't want credentials nodes nested in a second
                      configuration node -->
    <credentials>...</credentials>
    <credentials>...</credentials>
  </configuration>
</configuration>
Run Code Online (Sandbox Code Playgroud)

如果我删除该[XmlArray("configuration")]行,我会得到以下内容:

<configuration>
  <logging>...</logging>
  <Credentials><!-- Don't want credentials nodes nested in Credentials node -->
    <credentials>...</credentials>
    <credentials>...</credentials>
  </Credentials>
</configuration>
Run Code Online (Sandbox Code Playgroud)

如何<credentials>在单根节点中使用多个节点以我想要的方式对其进行序列化<configuration>?我想这样做而不必实现IXmlSerializable和执行自定义序列化.这是我的课程描述的方式:

[Serializable]
[XmlRoot("configuration")]
public class Configuration : IEquatable<Configuration>
Run Code Online (Sandbox Code Playgroud)

Mik*_*son 75

以下应按您希望的方式正确序列化.[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();
    }
}
Run Code Online (Sandbox Code Playgroud)

给出以下输出

<?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>
Run Code Online (Sandbox Code Playgroud)

  • 是的,这有效!我是如此设置"它是一个`列表`,必须在某处使用`XmlArrayItem`属性",我甚至没想到让它成为常规的`XmlElement`. (2认同)
  • 很好的答案,我有同样的问题 - 我想删除:<DATAITEMS> <DATAITEM /> <DATAITEM /> </ DATAITEMS>解决它:[XmlElement("DATAITEM")] public List <string> DATAITEM {get; 组; } (2认同)