2008-09-17 24 views
22

El Esquema XML Parte 2 especifica que una instancia de un tipo de datos que se define 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.XML Serialize booleano como 0 y 1

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

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

+0

Es posible que desee mencionar lo que está utilizando para hacer la serialización XML. –

+1

Una [pregunta] complementaria (http://codereview.stackexchange.com/questions/4829/presenting-a-boolean-as-an-int-for-xmlserialization-in-c) sobre el mismo tema en CoreReview.SE – MPelletier

Respuesta

3

Puede implementar IXmlSerializable que le permitirá alterar la salida serializada de su clase como lo desee. Esto implicará crear 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 .NET tratando de serializar el objeto en sí.

ejemplos se pueden encontrar en:

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

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

+1

Sí, esperaba evitar eso, pero parece que no tengo muchas opciones aquí. Gracias :) –

1

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

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

51

También puede hacer esto mediante el uso de algún XmlSerializer atributo de magia negro:

[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 puede utilizar otra ¡atributos para ocultar este miembro de intellisense si te ofende! No es una solución perfecta, pero puede ser más rápido que implementar IXmlSerializable.

+4

Esto es horrible, ¡pero resuelve el problema con precisión! Voto solo por amenazar la retención a corto plazo de mi desayuno. –

+0

¡Esto es exactamente lo que estaba buscando! Muchas gracias, creo que nunca podría almacenar valores booleanos en XML como "verdadero" y "falso". – Alex

+0

No es la mejor respuesta: ahora tiene dos propiedades en lugar de una. Encontré una solución mucho más clara aquí: https://stackoverflow.com/questions/5963423/xmlserializer-property-converter#answer-7775097 En resumen, cree una nueva clase/estructura que implemente IXmlSerializable. – Fl4v