在 Java 中,序列化(Serialization) 和 反序列化(Deserialization) 是用于 对象与字节流之间转换 的机制,通常用于在 网络传输、文件存储、缓存 等场景中。
序列化 是指将 Java 对象转换为字节流(byte stream) 的过程,以便:
序列化的核心作用:
import java.io.*;
class Person implements Serializable { // 必须实现 Serializable 接口
private static final long serialVersionUID = 1L; // 建议添加 serialVersionUID
String name;
int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
public class SerializeExample {
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("序列化成功!");
} catch (IOException e) {
e.printStackTrace();
}
}
}
输出:
序列化成功!
解释:
person.ser
文件中保存的是 Person
对象的 字节流形式。Serializable
是一个 标记接口(没有方法),用于标识可序列化的类。反序列化 是指将 字节流恢复为 Java 对象 的过程,用于:
反序列化的核心作用:
public class DeserializeExample {
public static void main(String[] args) {
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.ser"))) {
Person person = (Person) ois.readObject(); // 反序列化为对象
System.out.println("反序列化成功!");
System.out.println("姓名: " + person.name + ", 年龄: " + person.age);
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
输出:
反序列化成功!
姓名: Alice, 年龄: 30
解释:
ObjectInputStream
读取 person.ser
文件中的 字节流,并将其还原为 Person
对象。关键点 | 序列化(Serialization) | 反序列化(Deserialization) |
---|---|---|
作用 | 对象转字节流 | 字节流转对象 |
使用的流 | ObjectOutputStream |
ObjectInputStream |
标记接口 | Serializable |
Serializable (要求类可序列化) |
必须有 serialVersionUID 吗? | 建议有,用于版本控制 | 同上 |
无法序列化的修饰符 | transient (忽略字段),static (类级别,无需序列化) |
同上 |
没有实现 Serializable
接口:
NotSerializableException
异常。serialVersionUID 不一致:
InvalidClassException
异常。serialVersionUID
,如: private static final long serialVersionUID = 1L;
transient 关键字:
transient int password; // 不会被序列化