Лучший способ пойти о сериализации и десериализации объекта, не теряя его слушателей?

Вы смешиваете два способа внедрения зависимости ( https://en.wikipedia.org/wiki/Dependency_injection#Three_types_of_dependency_injection ). Вы должны создать правильный конструктор, и только этот construstor должен быть @Autowired. Ваш класс должен выглядеть примерно так:

private Source source;
private AWSProperties awsProperties;
private AuditRepository auditRepository;
private AmazonSQS sqs;

@Autowired
public SqssreaderApplication(Source source, AWSProperties awsProperties, AuditRepository auditRepository, AWSConfig awsConfig) {
    this.sqs = awsConfig.generateSQS();

Затем в своем тесте вы можете изменить свой подход # 1 и добавить все необходимые макеты через конструктор. Небольшой оффтоп: вы используете AWSProperties как в классах AWSConfig, так и в классах SqssreaderApplication. Проверьте, действительно ли вам это нужно в SqssreaderApplication.

7
задан 25 September 2008 в 07:14
поделиться

5 ответов

При реализации 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
  }
3
ответ дан 7 December 2019 в 16:47
поделиться

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

2
ответ дан 7 December 2019 в 16:47
поделиться

Я создал бы отделенную платформу события, подразумевая, что производитель события не будет связан непосредственно с потребителем события. Это могло состоять из 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.

0
ответ дан 7 December 2019 в 16:47
поделиться

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

-1
ответ дан 7 December 2019 в 16:47
поделиться

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

-1
ответ дан 7 December 2019 в 16:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: