Java序列化中readObject和readResolve方法的區別


序列化是將物件轉換為位元組流並將位元組流儲存在資料庫或記憶體中的過程。實現java.io.Serializable介面的類可以被序列化。

實現此介面的類將Java物件的序列化或持久化責任交給JVM。

根據 Oracle 文件:

readObject 方法:可序列化物件的每個子類都可以定義自己的 readObject 方法。如果一個類沒有實現該方法,則將使用 defaultReadObject 提供的預設序列化。當實現時,該類只負責恢復其自身的欄位,而不是其超型別或子型別的欄位。如果實現,則該類的 readObject 方法負責恢復類的狀態。物件的每個欄位的值(無論是瞬態的還是靜態的)都將設定為該欄位型別的預設值。

當 ObjectInputStream 從流中讀取一個物件並準備將其返回給呼叫者時,將呼叫 readResolve 方法。ObjectInputStream 檢查物件的類是否定義了 readResolve 方法。如果定義了該方法,則呼叫 readResolve 方法以允許流中的物件指定要返回的物件。返回的物件應與所有用途相容。如果不相容,則在發現型別不匹配時將丟擲 ClassCastException。

序號
關鍵點
ReadObject()
ReadResolve()

1

基本

readObject 方法用於從流中反序列化物件

當 ObjectInputStream 從流中讀取一個物件並準備將其返回給呼叫者時,將呼叫 readResolve 方法

2

它是 ObjectInputStream 類的一部分

它是 ObjectInputStream 的一部分

3


它不檢查物件的構造

readResolve 方法在物件完全構造之前不會被呼叫

ReadObject 示例

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class Main {
   public static void main(String[] args) {
      User object = new User(1, "Ram");
      String filename = "tutorialPoints.ser";
      User object1 = null;
      try {
         // Reading the object from a file
         FileInputStream file = new FileInputStream(filename);
         ObjectInputStream in = new ObjectInputStream(file);
         object1 = (User) in.readObject();
         in.close();
         file.close();
      }
      catch (IOException ex) {
         ex.printStackTrace();
      }
      catch (ClassNotFoundException ex) {
         ex.printStackTrace();
      }
   }
}
class User implements java.io.Serializable {
   public int id;
   public String name;
   // Default constructor
   public User(int id, String name) {
      this.id = id;
      this.name = name;
   }
}

更新時間: 2020年1月21日

2K+ 瀏覽量

啟動你的 職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.