2008-09-25 9 views
7

Tengo un objeto serializable con oyentes registrados. Actualmente, la lista de oyentes se almacena en el objeto como transient. Cuando el objeto se serializa y luego se deserializa, obviamente los oyentes ya no están registrados.¿La mejor manera de serializar y deserializar un objeto sin perder sus oyentes?

¿Cuál sería la forma más segura y mejor de proceder a volver a registrar los oyentes automáticamente una vez que el objeto se ha deserializado? ¿Hay un buen patrón de diseño que ayudaría aquí?

+0

Esto es un poco vago ... es posible que desee dar algunos detalles más ... ¿cuáles son las circunstancias que se publica por entregas/deserializado ... –

+0

Wow .. Creo que se necesita una gran cantidad de información .. Si el objeto se serializa para (suponiendo) moverse a través de los límites de la aplicación, las referencias no serían válidas, ¿o no? –

Respuesta

2

Puede usar un objeto proxy que actúe como escucha y transmisor de eventos y le asigne los oyentes reales, y luego asígnelo como oyente del objeto que se va a serializar. Cuando lo serialice y luego lo serialice, simplemente vuelva a asignarlo como un oyente del objeto deserializado.

0

Construiría un marco de eventos desacoplados, lo que significa que el productor del evento no estaría vinculado directamente al consumidor del evento. Esto podría consistir en un EventManager, un EventProducer y un EventListener que trabajen junto con la semántica de publicación/suscripción.

  1. Cuando se inicia el sistema (o en el primer uso) se crea un EventManager.
  2. EventListener se registra para recibir un tipo específico de eventos.
  3. El EventProducer está produciendo acontecimientos un edita sus obras a la EventManager
 
    public interface EventManager { 
     public void postEvent(Event event); 
     public void addListener(Class eventType, EventListener listener); 
    } 

    public interface EventListener { 
     public void handleEvent(Event event); 
    } 

De esta manera al serializar el productor entonces el EventManager todavía mantiene la lista de los oyentes suscritos. cuando el objeto se deserializa, aún puede publicar eventos en EventManager.

-1

En general, no reconocí ningún patrón útil para esto. Pero la combinación de varios estará bien :). La pregunta es ¿cómo manejas la deserialización? Si usa la forma estándar, puede introducir un mecanismo de búsqueda que se utilizará para localizar oyentes locales y volver a vincularlos a la instancia recién deserializada. Si tienes un deserializador propio, el camino será más simple. Simplemente deserialice el objeto y registre a los oyentes locales. El deserializador puede actuar como escucha proxy si es posible. La introducción de un modelo desacoplado también debería ser útil, como dijo Panagiotis. La solución exacta depende de su necesidad real, pero no se olvide de KISS.

-1

Use un registro en el que se registren tanto su editor como sus suscriptores. Como fue publicado por Korros, se lo conoce como un patrón de pizarra en tierra OSGI.

3

Si implementa readObject(), puede reconstruir el estado transitorio como parte de la deserialización. Debería tratar la deserialización como una construcción de objeto (porque lo es).

private void readObject(ObjectInputStream in) 
     throws ClassNotFoundException, IOException { 
    // do normal serialization first! 
    in.defaultReadObject(); 

    // put code here that can somehow reconstruct your listeners 
    // presumably you have someplace you can look them up 
    } 
Cuestiones relacionadas