Java 序列化(Serialization)是指将一个 Java 对象转换为字节流的过程,以便将其存储到文件、数据库或者通过网络进行传输。反序列化(Deserialization)是指将字节流重新转换为 Java 对象的过程。序列化的主要目的是为了保存对象的状态或实现对象的远程传输。
序列化的用途
- 持久化:将对象的状态保存到文件或数据库中,以便以后恢复。
- 网络传输:通过序列化将对象转化为字节流,可以在网络中传输,比如在分布式系统中传递对象。
- 深拷贝:通过序列化和反序列化,可以实现对象的深拷贝。
- 缓存:将对象序列化后存储到缓存中,提高应用性能。
如何实现 Java 序列化
要让一个 Java 对象可以序列化,必须满足以下条件:
-
实现
Serializable
接口:类必须实现java.io.Serializable
接口,这个接口是一个标记接口(没有任何方法),只是一个标识,告诉 Java 运行时该类的对象可以被序列化。 -
所有属性都必须是可序列化的:如果某个属性不可序列化,那么必须使用
transient
关键字标记,以跳过该属性的序列化。
序列化和反序列化示例
以下是一个简单的序列化和反序列化示例:
import java.io.*;
// 实现 Serializable 接口
class Person implements Serializable {
private static final long serialVersionUID = 1L; // 序列化版本号
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{name='" + name + "', age=" + age + "}";
}
}
public class SerializationExample {
public static void main(String[] args) {
Person person = new Person("Alice", 30);
// 序列化
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.ser"))) {
oos.writeObject(person);
System.out.println("序列化成功: " + person);
} catch (IOException e) {
e.printStackTrace();
}
// 反序列化
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.ser"))) {
Person deserializedPerson = (Person) ois.readObject();
System.out.println("反序列化成功: " + deserializedPerson);
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}