청취자가 등록 된 직렬화 가능 객체가 있습니다. 현재 리스너 목록은 객체에 으로 저장됩니다. 개체가 serialize 된 다음 deserialize 될 때 청취자는 더 이상 등록되지 않습니다.리스너를 잃지 않고 객체를 직렬화 및 비 직렬화하는 가장 좋은 방법은 무엇입니까?
개체가 deserialize되면 자동으로 리스너를 다시 등록하는 가장 안전한 방법은 무엇입니까? 여기에 도움이되는 좋은 디자인 패턴이 있습니까?
청취자가 등록 된 직렬화 가능 객체가 있습니다. 현재 리스너 목록은 객체에 으로 저장됩니다. 개체가 serialize 된 다음 deserialize 될 때 청취자는 더 이상 등록되지 않습니다.리스너를 잃지 않고 객체를 직렬화 및 비 직렬화하는 가장 좋은 방법은 무엇입니까?
개체가 deserialize되면 자동으로 리스너를 다시 등록하는 가장 안전한 방법은 무엇입니까? 여기에 도움이되는 좋은 디자인 패턴이 있습니까?
이벤트의 수신기와 브로드 캐스터 역할을하는 프록시 개체를 사용하여 실제 수신기를 할당 한 다음이를 직렬화 대상 개체의 수신기로 지정할 수 있습니다. 그것을 직렬화하고 역 직렬화 할 때 역 직렬화 된 객체의 리스너로 재 할당하십시오.
나는 이벤트 생성자가 이벤트 소비자에게 직접 바인딩되지 않는다는 것을 의미하는 분리 된 이벤트 프레임 워크를 작성할 것이다. 이것은 게시/예약 의미와 함께 작동하는 EventManager, EventProducer 및 EventListener로 구성 될 수 있습니다.
public interface EventManager { public void postEvent(Event event); public void addListener(Class eventType, EventListener listener); } public interface EventListener { public void handleEvent(Event event); }
에 게시합니다. 오브젝트가 직렬화 복원되면 (자), 이벤트를 EventManager에 포스트 할 수 있습니다.
일반적으로 나는 이것에 대한 유용한 패턴을 인식하지 못했습니다. 하지만 몇 가지 조합은 괜찮을 것입니다 :). 문제는 비 직렬화를 처리하는 방법입니다. 표준 방법을 사용하는 경우 로컬 리스너를 찾고 새로 deserialize 된 인스턴스에 다시 바인딩하는 데 사용할 조회 메커니즘을 도입 할 수 있습니다. 만약 당신이 자신의 디시리얼라이저를 가지고 있다면, 그 방법은 더 간단해질 것입니다. 객체를 deserialize하고 로컬 리스너를 등록하십시오. 가능한 경우 디시리얼라이저는 프록시 수신기로 작동 할 수 있습니다. Panagiotis에 따르면 일부 분리 모델을 도입하면 도움이 될 것입니다. 정확한 해결책은 실제 필요에 따라 다르지만 KISS을 잊지 마세요.
게시자와 구독자가 모두 등록한 레지스트리를 사용하십시오. Korros가 게시 한 것처럼 OSGI 랜드에서 화이트 보드 패턴이라고합니다.
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
}
이것은 당신이 좀 더 세부 사항을 제공 할 수 있습니다 ... 조금 모호은 ...이 직렬화되고있는 상황이 무엇인가/직렬화 복원 ... –
와우 .. 난 당신이 많이 필요 것 같아 정보 .. 객체가 (사실상) 앱 경계를 넘어서 이동하도록 직렬화되는 경우 참조는 유효하지 않겠습니까? –