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
最近学习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