序列化中readObject和readResolve方法之间的区别

序列化是将对象转换为流字节并将字节流存储在数据库或内存中的过程。实现java.io.Serializable接口的类可以序列化。 

实现此接口的类使JVM负责序列化或持久化Java对象 

根据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 {
         //从文件读取对象
         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;
   //默认构造函数
   public User(int id, String name) {
      this.id = id;
      this.name = name;
   }
}