2015-09-10 26 views
0

最近我學習了java程序language.I很好奇java可序列化,並有一點疑慮。java可序列化的對象可以在不同的類加載器之間傳遞嗎?

java可序列化的對象可以在不同的類加載器之間傳遞嗎? 理論是什麼?

+0

你能否重新說明你的問題。所有對象都可以在類加載器之間傳遞對象,在訪問未知類時您只會獲得異常。如果這是關於如何在不同的類加載器中爲類之間的通信編寫代碼,則序列化不是答案。 –

回答

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); 
    } 

反序列化的另一端/類加載器/ 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

+0

ObjectOutputStream和ObjectInputStream將對象作爲可序列化對象進行寫/讀對象是否一樣? –

+0

如果你問他們是否是同一個對象/課堂,當然是的,他們必須是同一個班級。因此,您需要將上述示例中的對象「Car」對象放在jar文件中,並將此jar文件放在兩個java進程的classpath中。你還需要對象具有相同的序列化版本ID:http://stackoverflow.com/questions/2258676/what-is-serial-version-id-in-java – chrisl08

+0

我想問一下,序列化的方式是否相同用ObjectInputStream/ObjectOutputStream讀取/寫入對象 –

1

「可序列化的對象」不能,但可以序列化對象,並將數據保存在任何地方。在未來的某個時間點,在同一臺機器上或不同的機器上,在同一個虛擬機或不同的虛擬機上,在相同的類加載器或不同的虛擬機中,可以將保存的數據反序列化爲對象。

+0

我只是讓一個對象實現Serializable接口。你的意思是這種方式不能完成在不同類加載器之間傳遞對象的目標? –

+0

你能舉一些例子嗎?謝謝 –

+0

你可以在這裏閱讀關於序列化的所有信息:https://docs.oracle.com/javase/8/docs/platform/serialization/spec/serialTOC.html – Andreas

相關問題