Лучший способ сериализации и десериализации объекта без потери его слушателей? - PullRequest
7 голосов
/ 25 сентября 2008

У меня есть сериализуемый объект с зарегистрированными слушателями. В настоящее время список слушателей хранится в объекте как transient. Когда объект сериализуется, а затем десериализуется, очевидно, что слушатели больше не регистрируются.

Каков был бы самый безопасный и лучший способ автоматически перерегистрировать слушателей после десериализации объекта? Есть ли хороший шаблон дизайна, который бы здесь помог?

Ответы [ 5 ]

3 голосов
/ 25 сентября 2008

Если вы реализуете readObject (), вы можете восстановить переходное состояние как часть десериализации. Вы должны рассматривать десериализацию как конструкцию объекта (потому что это так).

   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
  }
2 голосов
/ 25 сентября 2008

Вы можете использовать прокси-объект, который действует как слушатель и передатчик событий, назначить ему реальных слушателей, а затем назначить его слушателем объекта, подлежащего сериализации. Когда вы сериализуете, а затем десериализуете его, просто переназначьте его как прослушиватель десериализованного объекта.

0 голосов
/ 25 сентября 2008

Используйте реестр, в котором зарегистрирован ваш издатель и подписчики. Как было объявлено Корросом, он упоминается как шаблон доски на земле OSGI.

0 голосов
/ 25 сентября 2008

В общем, я не узнал никакой полезной схемы для этого. Но комбинация нескольких будет в порядке :). Вопрос в том, как вы справляетесь с десериализацией? При использовании стандартного способа вы можете ввести механизм поиска, который будет использоваться для определения местоположения локальных слушателей и привязки их к свеже десериализованному экземпляру. Если у вас есть собственный десериализатор, путь будет более простым. Просто десериализуйте объект и зарегистрируйте локальных слушателей. Десериализатор может выступать в качестве прокси-прослушивателя, если это возможно. По словам Панагиотиса, введение некоторой разделенной модели также должно быть полезным. Точное решение зависит от вашей реальной потребности, но не забудьте KISS it.

0 голосов
/ 25 сентября 2008

Я бы построил несвязанную структуру событий, что означает, что производитель событий не будет напрямую связан с потребителем событий. Это может быть EventManager, EventProducer и EventListener, работающие вместе с семантикой публикации / подписки.

  1. Когда система запускается (или при первом использовании), создается EventManager.
  2. EventListener регистрируется для получения определенного типа событий.
  3. EventProducer создает события и публикует их в EventManager
    public interface EventManager {
        public void postEvent(Event event);
        public void addListener(Class eventType, EventListener listener);
    }

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

Таким образом, когда вы сериализуете производителя, EventManager все еще поддерживает список подписанных слушателей. после десериализации объекта он все еще может публиковать события в EventManager.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...