2008-09-25 10 views
7

Ich habe ein serialisierbares Objekt mit Listenern registriert. Derzeit ist die Liste der Listener im Objekt als gespeichert. Wenn das Objekt serialisiert und anschließend deserialisiert wird, sind die Listener offensichtlich nicht mehr registriert.Der beste Weg, um ein Objekt zu serialisieren und zu deserialisieren, ohne seine Zuhörer zu verlieren?

Was wäre der sicherste und beste Weg, die Listener automatisch neu zu registrieren, sobald das Objekt deserialisiert wurde? Gibt es ein gutes Designmuster, das hier helfen könnte?

+0

Das ist ein bisschen vage ... Sie vielleicht ein paar mehr Details geben wollen ... was sind die Umstände es serialisiert wird/entserialisierten ... –

+0

Wow .. Ich denke, Sie viel brauchen würde Informationen .. Wenn das Objekt seriell zu (vermutlich) über App-Grenzen hinweg bewegt wird, wären die Referenzen ungültig, würden sie nicht? –

Antwort

2

Sie könnten ein Proxy-Objekt verwenden, das sowohl als Listener als auch als Broadcaster von Ereignissen fungiert, und ihm die tatsächlichen Listener zuweisen und es dann als Listener des zu serialisierenden Objekts zuweisen. Wenn Sie es serialisieren und es dann deserialisieren, ordnen Sie es einfach als Listener des deserialisierten Objekts zu.

0

Ich würde ein entkoppeltes Ereignis-Framework erstellen, was bedeutet, dass der Ereignisproduzent nicht direkt an den Ereigniskonsumenten gebunden wäre. Dies könnte aus einem EventManager, einem EventProducer und einem EventListener bestehen, die zusammen mit der Publish/Subscribe-Semantik arbeiten.

  1. Beim Start des Systems (oder bei der ersten Verwendung) wird ein EventManager erstellt.
  2. Der EventListener registriert sich selbst, um eine bestimmte Art von Ereignissen zu empfangen.
  3. Die EventProducer ist Ereignisse ein veröffentlicht sie zum Eventmanager
 
    public interface EventManager { 
     public void postEvent(Event event); 
     public void addListener(Class eventType, EventListener listener); 
    } 

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

Auf diese Weise, wenn Sie den Hersteller serialisiert dann die Eventmanager hält nach wie vor die Liste der abonnierten Zuhörer zu erzeugen. Wenn das Objekt deserialisiert wird, kann es weiterhin Ereignisse an den EventManager senden.

-1

Im Allgemeinen habe ich kein brauchbares Muster dafür erkannt. Aber die Kombination von mehreren wird in Ordnung sein :). Die Frage ist, wie Sie mit der Deserialisierung umgehen. Wenn Sie den Standardweg verwenden, können Sie einen Nachschlage-Mechanismus einführen, der verwendet wird, um lokale Listener zu lokalisieren und sie an die frisch deserialisierte Instanz zu binden. Wenn Sie einen eigenen Deserializer haben, wird der Weg einfacher sein. Objekte einfach deserialisieren und lokale Listener registrieren. Der Deserializer kann nach Möglichkeit als Proxy-Listener fungieren. Die Einführung eines entkoppelten Modells sollte ebenfalls hilfreich sein, wie Panagiotis sagte. Die genaue Lösung hängt von Ihrem wirklichen Bedarf ab, aber vergessen Sie nicht KISS es.

-1

Verwenden Sie eine Registrierung, bei der sich sowohl Ihr Herausgeber als auch Ihre Abonnenten registrieren. Wie von Korros geschrieben wurde, wird es als ein Whiteboard-Muster in OSGI Land bezeichnet.

3

Wenn Sie readObject() implementieren, können Sie den Übergangszustand als Teil der Deserialisierung rekonstruieren. Sie sollten Deserialisierung als Objektkonstruktion behandeln (weil es so ist).

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 
    } 
Verwandte Themen