Al usar la serialización XML para serializar una clase, cómo hacer que algún atributo se emita condicionalmente. es decir, en algún caso, muestra este atributo, en otros casos, no.cómo serializar algún atributo en alguna condición
Respuesta
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"; }
}
}
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
¿Funciona esto con xml-serialization? –
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
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.
WriteXml() no permite que el elemento se omita por completo. –
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
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.
- 1. .NET: ¿Cómo serializar binariamente un objeto con el atributo [DataContract]?
- 2. Cómo probar si existe un atributo en algún XML
- 3. XPath: ¿Cómo seleccionar un nodo con algún atributo por índice?
- 4. Condición basada en el valor del atributo (esquema XML)
- 5. ¿El atributo de enlace de condición no funciona?
- 6. doble si la condición, alguna manera de hacerlo en breve
- 7. cómo serializar ArrayList en android
- 8. ¿Hay algún tipo de palabra clave de "atributo" en C++?
- 9. ¿Cómo serializar el modelo anidado en rieles?
- 10. ¿Alguna razón para reemplazar mientras (condición) con para (; condición;) en C++?
- 11. Pregunta de serialización XML - Cómo serializar elemento, atributo y texto de un objeto
- 12. Omitir unidad si alguna condición en SetUpClass falla
- 13. ¿Cómo serializar un paquete?
- 14. Cómo serializar datos en C
- 15. cómo serializar hashtable en C#
- 16. Cómo XML Serializar un 'Tipo'
- 17. ¿Alguna manera de hacer DataContractJsonSerializer serializar diccionarios correctamente?
- 18. ¿Cómo puedo iterar indefinidamente, pero me detengo en alguna condición (es)?
- 19. Cómo serializar ByteBuffer
- 20. Jackson: ¿hay alguna forma de serializar POJO directamente a treemodel?
- 21. ¿Hay alguna forma de serializar el objeto linq para Memcached?
- 22. cómo serializar la clase?
- 23. ¿Cómo ignoro un atributo [XMLIgnore]
- 24. Serializar sin XmlInclude
- 25. ¿Cómo lees esta condición ternaria en Ruby?
- 26. ¿Cómo puedo pedir objetos de acuerdo con algún atributo del niño en OData?
- 27. Serializar
- 28. ¿Cómo serializar/deserializar un hashmap?
- 29. Serializar un nullable int
- 30. ¿Cómo hago webMethods serializar ExpandoObject
Creo que malinterpretaste la pregunta. OP quiere que se emita el atributo (incluido en el xml). –
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). –
Maldición, tengo que probar esto. No sabía que xD +1 – Anton