以下是关于Java序列化和反序列化的介绍:
定义
- 序列化:是将Java对象转换为字节序列的过程,便于对象在网络传输或存储到文件等操作。比如,将内存中的用户对象保存到数据库或通过网络发送给其他服务器,就需要先进行序列化。
- 反序列化:与序列化相反,是把字节序列恢复为Java对象的过程。当从文件读取数据或接收网络传输的对象数据后,需要通过反序列化将其还原为内存中的Java对象,以便程序进行后续处理。
实现方式
- 让Java类实现 java.io.Serializable 接口,这是一个标记接口,没有方法,仅用于标识该类可以被序列化。
- 示例代码如下:
java
import java.io.Serializable;
class User implements Serializable {
private String name;
private int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
}
- 然后可以使用 ObjectOutputStream 类的 writeObject() 方法进行序列化, ObjectInputStream 类的 readObject() 方法进行反序列化。示例代码如下:
java
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class Main {
public static void main(String[] args) {
// 序列化
User user = new User("John", 30);
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("user.obj"))) {
oos.writeObject(user);
} catch (Exception e) {
e.printStackTrace();
}
// 反序列化
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("user.obj"))) {
User deserializedUser = (User) ois.readObject();
System.out.println("Name: " + deserializedUser.name + ", Age: " + deserializedUser.age);
} catch (Exception e) {
e.printStackTrace();
}
}
}
应用场景
- 网络传输:在分布式系统中,不同节点间经常需要传递对象,如远程方法调用(RPC)时,需要将参数对象序列化后通过网络发送,在接收端再反序列化。
- 数据存储:将对象持久化到文件或数据库中,如缓存系统中,常将缓存对象序列化后存储到磁盘,服务器重启后再反序列化恢复。
- 对象克隆:通过序列化和反序列化可以创建对象的深拷贝,新对象与原对象相互独立,修改一个不会影响另一个。
注意事项
- 静态变量不会被序列化,因为静态变量属于类,不属于对象。
- transient关键字修饰的成员变量也不会被序列化,如不想对某个敏感字段进行序列化,就可以用该关键字修饰。
- 反序列化时,类的定义必须与序列化时一致,包括类名、包名、成员变量等,否则可能会导致反序列化失败。