serializar - usando el atributo XmlArrayItem sin XmlArray en la clase Serializable C#
serialize list to xml c# (1)
Quiero XML en el siguiente formato:
<configuration><!-- Only one configuration node -->
<logging>...</logging><!-- Only one logging node -->
<credentials>...</credentials><!-- One or more credentials nodes -->
<credentials>...</credentials>
</configuration>
Estoy intentando crear una Configuration
clase que tiene el atributo [Serializable]
. Para serializar los nodos de credenciales, tengo lo siguiente:
[XmlArray("configuration")]
[XmlArrayItem("credentials", typeof(CredentialsSection))]
public List<CredentialsSection> Credentials { get; set; }
Sin embargo, cuando serializo esto a XML, el XML está en el siguiente formato:
<configuration>
<logging>...</logging>
<configuration><!-- Don''t want credentials nodes nested in a second
configuration node -->
<credentials>...</credentials>
<credentials>...</credentials>
</configuration>
</configuration>
Si [XmlArray("configuration")]
la línea [XmlArray("configuration")]
, obtengo lo siguiente:
<configuration>
<logging>...</logging>
<Credentials><!-- Don''t want credentials nodes nested in Credentials node -->
<credentials>...</credentials>
<credentials>...</credentials>
</Credentials>
</configuration>
¿Cómo puedo serializar esto como quiero, con múltiples nodos <credentials>
dentro del nodo raíz único <configuration>
? Quería hacer esto sin tener que implementar IXmlSerializable
y hacer una serialización personalizada. Así es como se describe mi clase:
[Serializable]
[XmlRoot("configuration")]
public class Configuration : IEquatable<Configuration>
Lo siguiente debe serializarse correctamente de la manera que desee. La pista está en [XmlElement("credentials")]
en la lista. Hice esto tomando su xml, generando un esquema (xsd) a partir de él en Visual Studio. Luego ejecuta xsd.exe en el esquema para generar una clase. (Y algunas ediciones pequeñas)
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();
}
}
dar la siguiente salida
<?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>