48 votes

à l'aide de l'attribut XmlArrayItem sans XmlArray sur la classe C # sérialisable

Je veux XML dans le format suivant:

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

Je suis en train de créer une classe Configuration qui a [Serializable] d'attribut. Pour sérialiser les informations d'identification des nœuds, j'ai le texte suivant:

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

Cependant, quand je sérialiser ce XML, XML est le format suivant:

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

Si je supprime l' [XmlArray("configuration")] de la ligne, je reçois le texte suivant:

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

Comment puis-je sérialiser ce la façon dont je le veux, avec de multiples <credentials> des nœuds dans le seul nœud racine <configuration>? Je voulais le faire sans avoir à mettre en oeuvre IXmlSerializable et de faire de la sérialisation personnalisée. C'est ainsi que ma classe est décrite:

[Serializable]
[XmlRoot("configuration")]
public class Configuration : IEquatable<Configuration>

75voto

Mikael Svenson Points 18243

Ce qui suit devrait sérialiser correctement comme vous le souhaitez. L'indice étant [XmlElement("credentials")] sur la liste. Je l'ai fait en prenant votre XML, générant un schéma (xsd) à partir de celui-ci dans Visual Studio. Ensuite, exécutez xsd.exe sur le schéma pour générer une classe. (Et quelques petites modifications)

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

donne le résultat suivant

 <?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>
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X