java 可序列化对象可以在不同的类加载器之间传递吗?

Can java serializable objects pass between different classloaders?

最近学习java程序language.I对java序列化很好奇,有点疑惑

Can java serializable objects pass between different classloaders? What's the theory?

A "serializable object" 不行,但是你可以序列化对象,然后把数据保存到任何地方。在未来的某个时候,在同一台机器或不同的机器上,在相同的 VM 或不同的虚拟机中,在相同的类加载器或不同的类加载器中,您可以将保存的数据反序列化回对象。

仅通过实现 Serializable 接口将不允许您 "pass between different classloaders" 。您需要编写代码将序列化对象持久保存到磁盘,然后在另一个类加载器(进程)上反序列化它。这是一个示例,摘自 http://www.javapractices.com/topic/TopicAction.do?Id=57

    Car car = new Car();
    ....

    //serialize an object called it car to a file called car.ser.
    try (
      OutputStream file = new FileOutputStream("car.ser");
      OutputStream buffer = new BufferedOutputStream(file);
      ObjectOutput output = new ObjectOutputStream(buffer);
    ){
      output.writeObject(car); // this call writes file to disk
    }  
    catch(IOException ex){
      logger.log(Level.SEVERE, "Cannot perform output.", ex);
    }

要在另一个 end/classloader/jvm 进程上反序列化对象,您可以这样做:

 try(
      InputStream file = new FileInputStream("car.ser");
      InputStream buffer = new BufferedInputStream(file);
      ObjectInput input = new ObjectInputStream (buffer);
    ){
      //deserialize the List
      Car car = (Car)input.readObject();
      //display its data
      System.out.println("Recovered Car: " + car);

    }
    catch(ClassNotFoundException ex){
      logger.log(Level.SEVERE, "Cannot perform input. Class not found.", ex);
    }
    catch(IOException ex){
      logger.log(Level.SEVERE, "Cannot perform input.", ex);
    }

编辑: 为了获取序列化文件并反序列化它们,您可以使用 WatchService