Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在不丢失侦听器的情况下序列化和反序列化对象的最佳方法?_Java_Serialization - Fatal编程技术网

Java 在不丢失侦听器的情况下序列化和反序列化对象的最佳方法?

Java 在不丢失侦听器的情况下序列化和反序列化对象的最佳方法?,java,serialization,Java,Serialization,我有一个已注册侦听器的可序列化对象。当前,侦听器列表存储在对象中为transient。当对象序列化然后反序列化时,显然监听器不再注册 反序列化对象后,自动重新注册侦听器的最安全和最好的方法是什么?有没有一个好的设计模式可以在这里提供帮助?您可以使用一个代理对象,它同时充当事件的侦听器和广播器,并将真正的侦听器分配给它,然后将其分配为要序列化对象的侦听器。当您序列化它然后反序列化它时,只需将其重新指定为反序列化对象的侦听器。我将构建一个解耦的事件框架,这意味着事件生成器不会直接绑定到事件使用者。

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


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

您可以使用一个代理对象,它同时充当事件的侦听器和广播器,并将真正的侦听器分配给它,然后将其分配为要序列化对象的侦听器。当您序列化它然后反序列化它时,只需将其重新指定为反序列化对象的侦听器。

我将构建一个解耦的事件框架,这意味着事件生成器不会直接绑定到事件使用者。 这可能包括一个EventManager、一个EventProducer和一个EventListener,它们与发布/订阅语义一起工作

  • 系统启动时(或首次使用时),将创建EventManager
  • EventListener注册自己以接收特定类型的事件
  • EventProducer正在生成事件并将其发布到EventManager
  • 公共接口事件管理器{ 公共无效事后(事件); public void addListener(类eventType,EventListener-listener); } 公共接口事件侦听器{ 公共无效handleEvent(事件); }
    通过这种方式,当序列化生产者时,EventManager仍然维护已订阅侦听器的列表。当对象被反序列化时,它仍然可以将事件发布到EventManager。

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

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

    如果实现readObject(),则可以在反序列化过程中重建瞬态。您应该将反序列化视为对象构造(因为它是)


    这有点模糊。。。你可能想提供更多的细节。。。正在序列化/反序列化的情况是什么…哇。。我想你需要很多信息。。如果对象被序列化为(假定)跨应用程序边界移动,则引用将无效,不是吗? public interface EventManager { public void postEvent(Event event); public void addListener(Class eventType, EventListener listener); } public interface EventListener { public void handleEvent(Event event); }
       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
      }