2008-09-25 4 views
7

청취자가 등록 된 직렬화 가능 객체가 있습니다. 현재 리스너 목록은 객체에 으로 저장됩니다. 개체가 serialize 된 다음 deserialize 될 때 청취자는 더 이상 등록되지 않습니다.리스너를 잃지 않고 객체를 직렬화 및 비 직렬화하는 가장 좋은 방법은 무엇입니까?

개체가 deserialize되면 자동으로 리스너를 다시 등록하는 가장 안전한 방법은 무엇입니까? 여기에 도움이되는 좋은 디자인 패턴이 있습니까?

+0

이것은 당신이 좀 더 세부 사항을 제공 할 수 있습니다 ... 조금 모호은 ...이 직렬화되고있는 상황이 무엇인가/직렬화 복원 ... –

+0

와우 .. 난 당신이 많이 필요 것 같아 정보 .. 객체가 (사실상) 앱 경계를 넘어서 이동하도록 직렬화되는 경우 참조는 유효하지 않겠습니까? –

답변

2

이벤트의 수신기와 브로드 캐스터 역할을하는 프록시 개체를 사용하여 실제 수신기를 할당 한 다음이를 직렬화 대상 개체의 수신기로 지정할 수 있습니다. 그것을 직렬화하고 역 직렬화 할 때 역 직렬화 된 객체의 리스너로 재 할당하십시오.

0

나는 이벤트 생성자가 이벤트 소비자에게 직접 바인딩되지 않는다는 것을 의미하는 분리 된 이벤트 프레임 워크를 작성할 것이다. 이것은 게시/예약 의미와 함께 작동하는 EventManager, EventProducer 및 EventListener로 구성 될 수 있습니다.

  1. 시스템이 시작될 때 (또는 처음 사용할 때) EventManager가 만들어집니다.
  2. EventListener는 특정 종류의 이벤트를 수신하기 위해 자체적으로 등록합니다. 당신이 프로듀서를 직렬화 한 후 개의 EventManager 여전히 가입 청취자의 목록을 유지 관리 할 때
  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에 포스트 할 수 있습니다.

-1

일반적으로 나는 이것에 대한 유용한 패턴을 인식하지 못했습니다. 하지만 몇 가지 조합은 괜찮을 것입니다 :). 문제는 비 직렬화를 처리하는 방법입니다. 표준 방법을 사용하는 경우 로컬 리스너를 찾고 새로 deserialize 된 인스턴스에 다시 바인딩하는 데 사용할 조회 메커니즘을 도입 할 수 있습니다. 만약 당신이 자신의 디시리얼라이저를 가지고 있다면, 그 방법은 더 간단해질 것입니다. 객체를 deserialize하고 로컬 리스너를 등록하십시오. 가능한 경우 디시리얼라이저는 프록시 수신기로 작동 할 수 있습니다. Panagiotis에 따르면 일부 분리 모델을 도입하면 도움이 될 것입니다. 정확한 해결책은 실제 필요에 따라 다르지만 KISS을 잊지 마세요.

-1

게시자와 구독자가 모두 등록한 레지스트리를 사용하십시오. Korros가 게시 한 것처럼 OSGI 랜드에서 화이트 보드 패턴이라고합니다.

3

readObject()를 구현하면 비 직렬화의 일부로 임시 상태를 재구성 할 수 있습니다. deserialization은 객체 구조로 취급해야합니다 (객체이기 때문에).

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 
    } 
관련 문제