XML Serializa booleano como 0 y 1


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

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

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

Author: e-sushi, 2008-09-17

3 answers

Puede implementar IXmlSerializable que le permitirá alterar 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 llama a 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

 3
Author: Wolfwyrd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-17 15:31:20

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

[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.

 52
Author: Simon Steele,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-16 11:24:39

No, no se utiliza el sistema predeterminado.XML.XmlSerializer: tendría que cambiar el tipo de datos a un int para lograr eso, o perder el tiempo proporcionando su propio código de serialización (posible, pero no muy divertido).

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

 1
Author: mdb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-17 15:30:40