2009-03-13 4 views
10

Me gustaría implementar IXmlSerializable en una clase y solo anular ReadXml o WriteXml, pero no ambos. Si no implementé IXMLSerializable en esta clase, XMLSerializer serializaría automáticamente todos los miembros. Me gustaría que el comportamiento predeterminado se aplique para el caso no reemplazado. Sin embargo, dado que IXmlSerializable es una interfaz, y no una clase base, no estoy seguro de cómo hacerlo.Al implementar IXmlSerializable, ¿cómo solo anular ReadXml o WriteXml y no ambos?

Además, necesito, en un caso, hacer el comportamiento predeterminado, y cuando eso esté completo añadir un código adicional. Entonces, me gustaría sobrescribir y volver a llamar al comportamiento de clase 'base'. De nuevo, esto sería trivial si hubiera una clase base, pero no tan trivial ya que esta es una interfaz.

Gracias!

Respuesta

4

La capacidad de realizar acciones antes/después de la serialización/deserialización se proporciona con atributos. Marque con un método OnDeserializedAttribute para que pueda ser llamado después de una instancia se ha deserialised, simplemente asegurar el método tiene la firma derecha:

[OnDeserializedAttribute()] 
private void RunThisMethod(StreamingContext context) { 
    // ... 
} 

NB. Este atributo funciona para formateadores Binary, SOAP y DataAttribute, pero no para XmlSerializer. No hay ningún atributo o mecanismo aparte de la implementación de IXmlSerializable.

Además, no olvide que puede leer documentos XML directamente y escribir código en (de) serializar.


Respuesta original: Si tiene que anular por completo una de serialización o deserialización (y por lo tanto poner en práctica IXmlSerializable entonces usted tiene que hacer las dos cosas a sí mismo

Puede ser posible hacer uso de los atributos y otros. mecanismos para evitar el uso de IXmlSerializable, se puede ampliar la pregunta con detalles de por qué es necesario implementar sólo uno de ReadXml o WriteXml.

+0

Es una necesidad extraña: al final de la deserialización de ciertas clases, necesito registrar las instancias recién creadas. Por lo tanto, esperaba: (1) Dejar la serialización tal como está, y (2) Anular la deserialización y agregar mi código de registro. – Eric

+0

¿Necesita un equivalente a OnDeserializedAttribute que se aplica al serializador XML? – Richard

+0

¡OnDeserialized hará el truco! Copie esto en el texto y lo marcaré como respondido. – Eric

1

Deberá implementar ambos métodos, pero esa es toda la extensión de su responsabilidad (en lo que respecta al compilador). Puede devolver nulo o lanzar una excepción en el método que no usará.

EDITAR

I'd like the default behavior to apply for the non-overridden case.

comportamiento por defecto Lo que te refieres? Como está implementando una interfaz, no hay un comportamiento predeterminado.

+0

Si no implementó IXmlSerializable en esta clas s, el XMLSerializer serializaría automáticamente a todos los miembros. Ese es el comportamiento 'predeterminado' que estoy buscando. – Eric

+0

Podría arrojar una excepción NotSupportedException en el método que no es compatible –

Cuestiones relacionadas