簡體   English   中英

Java可序列化對象可以在不同的類加載器之間傳遞嗎?

[英]Can java serializable objects pass between different classloaders?

最近我學習了Java程序語言,對Java可序列化感到好奇,對此有些疑問。

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

“可序列化的對象”不能,但是您可以序列化對象,並將數據保存在任何地方。 將來,在同一台機器或另一台機器上,同一台VM或另一台機器上,同一類加載器或另一台機器上,您可以將保存的數據反序列化為一個對象。

僅通過實現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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM