Pregunta

El esquema XML Parte 2 especifica que una instancia de un tipo de datos definido como booleano puede tener los siguientes literales legales {verdadero, falso, 1, 0}.El siguiente XML, por ejemplo, cuando se deserializa, establece la propiedad booleana "Emular" en true.

<root>
    <emulate>1</emulate>
</root>

Sin embargo, cuando serializo el objeto nuevamente al XML, obtengo true en lugar del valor numérico.Mi pregunta es, ¿hay alguna manera de controlar la representación booleana en XML?

¿Fue útil?

Solución

Puede implementar IXmlSerializable que le permitirá modificar la salida serializada de su clase como desee.Esto implicará la creación de los 3 métodos GetSchema(), ReadXml(XmlReader r) y WriteXml(XmlWriter r).Cuando implementa la interfaz, se llaman estos métodos en lugar de que .NET intente serializar el objeto en sí.

Se pueden encontrar ejemplos en:

http://www.developerfusion.co.uk/show/4639/ y

http://msdn.microsoft.com/en-us/library/system.xml.serialization.ixmlserializable.aspx

Otros consejos

También puedes hacer esto usando algún atributo de magia negra de XmlSerializer:

[XmlIgnore]
public bool MyValue { get; set; }

/// <summary>Get a value purely for serialization purposes</summary>
[XmlElement("MyValue")]
public string MyValueSerialize
{
    get { return this.MyValue ? "1" : "0"; }
    set { this.MyValue = XmlConvert.ToBoolean(value); }
}

¡También puedes usar otros atributos para ocultar a este miembro de Intellisense si te ofende!No es una solución perfecta, pero puede ser más rápida que implementar IXmlSerializable.

No, no uso el System.Xml.XmlSerializer predeterminado:necesitaría cambiar el tipo de datos a int para lograrlo, o intentar proporcionar su propio código de serialización (posible, pero no muy divertido).

Sin embargo, puede simplemente postprocesar el XML generado, por supuesto, ya sea usando XSLT o simplemente usando la sustitución de cadenas.Un pequeño truco, pero bastante rápido, tanto en tiempo de desarrollo como en tiempo de ejecución...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top