序列化是将Java对象转换为字节流以便存储或传输,反序列化是将其恢复为对象的过程。实现Serializable接口即可支持序列化,使用ObjectOutputStream的writeObject()方法序列化对象到文件,通过ObjectInputStream的readObject()方法读取并还原对象,需注意serialVersionUID一致性、静态变量不被序列化、transient字段跳过及父类序列化要求等关键细节。
序列化与反序列化是Java中处理对象持久化的重要机制。简单来说,序列化是将一个Java对象转换为字节流的过程,而反序列化则是将字节流恢复为原来的对象。这种机制常用于对象的网络传输、保存到文件或数据库等场景。
当你需要把一个对象保存到磁盘或者通过网络发送时,Java不能直接处理整个对象。它必须把对象“打散”成一串可存储或可传输的字节。这个过程就是序列化。
要让一个类支持序列化,只需实现 java.io.Serializable 接口。这个接口是一个标记接口,不需要实现任何方法。
例如:
public class Person implements Serializable {
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 + "}";
}
}
实现了 Serializable 后,就可以使用 ObjectOutputStream 将对象写入文件或输出流。
使用 ObjectOutputStream
可以完成序列化。以下是一个将对象保存到文件的例子:
代码示例:
Person person = new Person("Alice", 25);
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.ser"))) {
oos.writeObject(person);
System.out.println("对象已序列化");
} catch (IOException e) {
e.printStackTrace();
}
反序列化是序列化的逆过程。使用 ObjectInputStream 从字节流中重建对象。
示例代码:
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.ser"))) {
Person person = (Person) ois.readObject();
System.out.println("反序列化对象:" + person);
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
虽然序列化使用简单,但有几个细节容易忽略:
基本上就这些。掌握序列化和反序列化,就能在需要保存或传输对象时灵活应对。不复杂但容易忽略细节。