最近我學習了java程序language.I很好奇java可序列化,並有一點疑慮。java可序列化的對象可以在不同的類加載器之間傳遞嗎?
java可序列化的對象可以在不同的類加載器之間傳遞嗎? 理論是什麼?
最近我學習了java程序language.I很好奇java可序列化,並有一點疑慮。java可序列化的對象可以在不同的類加載器之間傳遞嗎?
java可序列化的對象可以在不同的類加載器之間傳遞嗎? 理論是什麼?
僅通過實現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);
}
反序列化的另一端/類加載器/ 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進程的classpath中。你還需要對象具有相同的序列化版本ID:http://stackoverflow.com/questions/2258676/what-is-serial-version-id-in-java – chrisl08
我想問一下,序列化的方式是否相同用ObjectInputStream/ObjectOutputStream讀取/寫入對象 –
「可序列化的對象」不能,但可以序列化對象,並將數據保存在任何地方。在未來的某個時間點,在同一臺機器上或不同的機器上,在同一個虛擬機或不同的虛擬機上,在相同的類加載器或不同的虛擬機中,可以將保存的數據反序列化爲對象。
我只是讓一個對象實現Serializable接口。你的意思是這種方式不能完成在不同類加載器之間傳遞對象的目標? –
你能舉一些例子嗎?謝謝 –
你可以在這裏閱讀關於序列化的所有信息:https://docs.oracle.com/javase/8/docs/platform/serialization/spec/serialTOC.html – Andreas
你能否重新說明你的問題。所有對象都可以在類加載器之間傳遞對象,在訪問未知類時您只會獲得異常。如果這是關於如何在不同的類加載器中爲類之間的通信編寫代碼,則序列化不是答案。 –