【问题标题】:Best way to go about serializing and deserializing an object without losing its listeners?在不丢失侦听器的情况下序列化和反序列化对象的最佳方法?
【发布时间】:2008-09-25 07:14:00
【问题描述】:

我有一个注册了侦听器的可序列化对象。当前,侦听器列表以transient 的形式存储在对象中。当对象被序列化然后反序列化时,显然不再注册监听器。

在对象被反序列化后,自动重新注册侦听器的最安全和最好的方法是什么?有什么好的设计模式可以帮助到这里吗?

【问题讨论】:

  • 这有点含糊......您可能想提供更多细节......它被序列化/反序列化的情况是什么......
  • 哇.. 我认为您需要很多信息.. 如果对象被序列化为(假设)跨应用程序边界移动,那么引用将是无效的,不是吗?

标签: java serialization


【解决方案1】:

如果你实现了 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】:

    您可以使用代理对象,它既充当事件的侦听器又充当事件的广播者,并为其分配真正的侦听器,然后将其分配为待序列化对象的侦听器。当你序列化它然后反序列化它时,只需将它重新分配为反序列化对象的侦听器即可。

    【讨论】:

      【解决方案3】:

      我将构建一个分离的事件框架,这意味着事件生产者不会直接绑定到事件消费者。 这可能由一个 EventManager、一个 EventProducer 和一个 EventListener 与发布/订阅语义一起工作。

      1. 系统启动时(或第一次使用时)会创建一个 EventManager。
      2. EventListener 注册自己以接收特定类型的事件。
      3. EventProducer 正在生成事件并将它们发布到 EventManager
      公共接口事件管理器{ 公共无效postEvent(事件事件); public void addListener(Class eventType, EventListener listener); } 公共接口事件监听器 { 公共无效句柄事件(事件事件); }

      这样,当您序列化生产者时,EventManager 仍会维护订阅的侦听器列表。当对象被反序列化时,它仍然可以将事件发布到 EventManager。

      【讨论】:

        【解决方案4】:

        总的来说,我没有认识到任何有用的模式。但是几个组合就可以了:)。问题是你如何处理反序列化?如果使用标准方式,您可以引入查找机制,该机制将用于定位本地侦听器并将它们重新绑定到新反序列化的实例。如果你有自己的反序列化器,方法会更简单。只需反序列化对象并注册本地侦听器。如果可能,反序列化器可以充当代理侦听器。正如 Panagiotis 所说,引入一些解耦模型也应该会有所帮助。确切的解决方案取决于您的实际需求,但不要忘记KISS

        【讨论】:

          【解决方案5】:

          使用您的发布者和订阅者都注册的注册表。正如 Korros 所发布的,它在 OSGI 领域被称为白板模式。

          【讨论】:

            猜你喜欢
            • 2011-09-23
            • 2012-10-04
            • 1970-01-01
            • 2021-10-24
            • 1970-01-01
            • 2014-03-02
            • 1970-01-01
            • 1970-01-01
            • 2013-04-24
            相关资源
            最近更新 更多