我有一个注册了侦听器的可序列化对象。当前,侦听器列表存储在对象中为transient
. 当对象被序列化然后反序列化时,显然不再注册监听器。
一旦对象被反序列化,自动重新注册监听器的最安全和最好的方法是什么?是否有一个很好的设计模式可以帮助到这里?
我有一个注册了侦听器的可序列化对象。当前,侦听器列表存储在对象中为transient
. 当对象被序列化然后反序列化时,显然不再注册监听器。
一旦对象被反序列化,自动重新注册监听器的最安全和最好的方法是什么?是否有一个很好的设计模式可以帮助到这里?
如果实现 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
}
您可以使用代理对象作为事件的侦听器和广播器,并将真正的侦听器分配给它,然后将其分配为待序列化对象的侦听器。当您对其进行序列化然后对其进行反序列化时,只需将其重新分配为反序列化对象的侦听器即可。
我将构建一个解耦的事件框架,这意味着事件生产者不会直接绑定到事件消费者。这可能由一个 EventManager、一个 EventProducer 和一个 EventListener 与发布/订阅语义一起工作。
公共接口事件管理器{ 公共无效postEvent(事件事件); public void addListener(Class eventType, EventListener listener); } 公共接口事件监听器 { 公共无效句柄事件(事件事件); }
这样,当您序列化生产者时,EventManager 仍会维护订阅的侦听器列表。当对象被反序列化时,它仍然可以将事件发布到 EventManager。
一般来说,我没有认识到任何有用的模式。但是几个组合就可以了:)。问题是你如何处理反序列化?如果使用标准方式,您可以引入查找机制,该机制将用于定位本地侦听器并将它们重新绑定到新反序列化的实例。如果你有自己的反序列化器,方法会更简单。只需反序列化对象并注册本地侦听器。如果可能,反序列化器可以充当代理侦听器。正如 Panagiotis 所说,引入一些解耦模型也应该会有所帮助。确切的解决方案取决于您的实际需求,但不要忘记亲吻它。
使用您的发布者和订阅者都注册的注册表。正如 Korros 所发布的,它在 OSGI 领域被称为白板模式。