2010-12-08 21 views

Respuesta

13

Puede crear una propiedad adicional llamada MyPropertySpecified, que devuelve un valor booleano.
Cuando esta propiedad devuelve verdadero, la propiedad MyProperty se serializará. Cuando devuelve falso, no será serializado.

Además, querrá decorar esa propiedad con el XmlIgnoreAttribute, de modo que esta propiedad específica no se serialice.

Ejemplo:

public class Person 
{ 
    public string Name 
    { 
     get; 
     set; 
    } 

    [XmlIgnore] 
    public bool NameSpecified 
    { 
     get { return Name != "secret"; } 
    } 
} 
+0

Creo que malinterpretaste la pregunta. OP quiere que se emita el atributo (incluido en el xml). –

+2

Como yo lo veo, quiere sacar (serializar) algunas propiedades de esta clase a xml en algunos casos, y en otros casos no quiere. Esto es resuelto por mi respuesta. Si desea que esta propiedad se serialice como un atributo, o como un elemento que se puede definir mediante los otros atributos XMLSerializationAttributes que están disponibles. (XmlAttribute por ejemplo). –

+0

Maldición, tengo que probar esto. No sabía que xD +1 – Anton

0

Puede usar OnSerializingAttribute al serializar, lo que nos permite invocar el método antes de la serialización. Puede obtener más información al respecto here

+0

¿Funciona esto con xml-serialization? –

+0

Además de eso, ¿qué haría si el atributo específico fuera un tipo de valor? Hasta donde sé, OnSerializing se puede usar para establecer valores, etc. durante la serialización, no cambia si el atributo será serializado. Supongo que espera que los valores nulos no se serialicen, pero en el caso de los tipos de valor habrá un valor en la propiedad y, por lo tanto, requeriría trabajo adicional para obtener el comportamiento que el OP desea, creo. – Anton

0

En mi humilde opinión lo que se necesita para implementar IXmlSerializable de la clase y poner en práctica los métodos WriteXml y ReadXml de tal manera que sólo escribir el atributo base a las condiciones que especifique y pueden manejar la lectura con o sin ese atributo particular presente en la deserialización.

IXmlSerializable at Msdn

+0

WriteXml() no permite que el elemento se omita por completo. –

+0

Implementación de IXmlSerializable hace que crees el objeto serializado para toda la instancia de clase en xml por completo. Por lo tanto, puede omitir atributos y elementos para cualquier propiedad de la clase X. Claro, no puedes omitir el elemento de nivel de clase, lo cual tiene sentido. Eso produciría un documento xml sin un elemento raíz o debería ser manejado por la instancia de clase que 'tiene' la clase X como uno de sus miembros serializados. – Anton

4

Mientras que funciona y es una solución bastante corto, el patrón propertyNameSpecified tiene algunos inconvenientes en mi opinión (contamina el interfaz de su clase; se basa en los nombres de propiedades; introduce el comportamiento implícito).

Si solo necesita implementar una condición simple (por ejemplo, no serializar un valor predeterminado), entonces el atributo DefaultValue es una mejor opción.

Por ejemplo:

public class PurchaseOrder 
{ 
    [DefaultValue("2002")] 
    public string Year; 
} 

Si el año tiene el valor "2002", que se omiten en la salida XML.

Cuestiones relacionadas