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;
}
}
广告
数据结构
网络
RDBMS
操作系统
Java
iOS
HTML
CSS
Android
Python
C语言编程
C++
C#
MongoDB
MySQL
Javascript
PHP