【问题标题】:Can java serializable objects pass between different classloaders?java可序列化对象可以在不同的类加载器之间传递吗?
【发布时间】:2015-09-10 03:55:28
【问题描述】:

最近在学习java程序语言,对java serializable很好奇,有点疑惑。

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

【问题讨论】:

  • 能否请您重新表述您的问题。所有对象都可以在类加载器之间传递对象,访问未知类时只会出现异常。如果这是关于如何为不同类加载器中的类之间的通信编写代码,则序列化不是答案。

标签: java classloader serializable


【解决方案1】:

仅仅通过实现 Serializable 接口将不允许您“在不同的类加载器之间传递”。您需要编写代码将序列化对象持久化到磁盘,然后在另一个类加载器(进程)上对其进行反序列化。这是一个例子,取自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);
    }

要反序列化另一端/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

【讨论】:

  • ObjectOutputStream 和 ObjectInputStream 作为可序列化对象写入/读取对象是一样的吗?
  • 如果你问它们是否是同一个对象/类,是的,它们当然必须是同一个类。所以你需要将上面示例中的对象“Car”对象放在一个jar文件中,并将这个jar文件放在两个java进程的类路径中。您还需要对象具有相同的序列化版本 ID:stackoverflow.com/questions/2258676/…
  • 想问一下ObjectInputStream/ObjectOutputStream读写对象的序列化方式是否一样
  • 我不确定你在问什么,但不是,一个写序列化对象,另一个读序列化对象。
【解决方案2】:

“可序列化对象”不能,但您可以序列化对象,并将数据保存在任何地方。在未来的某个时刻,在同一台机器上或另一台机器上,在同一台 VM 或另一台机器上,在同一个类加载器或不同的机器上,您可以将保存的数据反序列化回一个对象。

【讨论】:

  • 我只是让一个对象实现了Serializable接口。你的意思是这样就不能完成在不同类加载器之间传递对象的目标?
  • 你可以在这里阅读所有关于序列化的内容:docs.oracle.com/javase/8/docs/platform/serialization/spec/…
  • ObjectOutputStream 和 ObjectInputStream 作为可序列化对象写入/读取对象是一样的吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-24
相关资源
最近更新 更多