java序列化如何实现
Java序列化的基本概念
Java序列化是将对象转换为字节流的过程,便于存储或网络传输。反序列化则是将字节流还原为对象。Java通过Serializable接口和ObjectOutputStream/ObjectInputStream实现序列化与反序列化。
实现序列化的步骤
1. 实现Serializable接口
需要序列化的类必须实现java.io.Serializable接口(标记接口,无方法)。
public class Person implements Serializable {
private String name;
private int age;
// 构造方法、getter/setter省略
}
2. 使用ObjectOutputStream序列化对象
通过ObjectOutputStream将对象写入文件或字节流。
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.ser"))) {
Person person = new Person("Alice", 30);
oos.writeObject(person);
} catch (IOException e) {
e.printStackTrace();
}
3. 使用ObjectInputStream反序列化对象
通过ObjectInputStream从字节流中恢复对象。
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.ser"))) {
Person restoredPerson = (Person) ois.readObject();
System.out.println(restoredPerson.getName()); // 输出: Alice
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
自定义序列化控制
1. transient关键字
标记字段不被序列化。
private transient String password; // 序列化时忽略
2. 重写writeObject和readObject方法
自定义序列化逻辑。
private void writeObject(ObjectOutputStream out) throws IOException {
out.defaultWriteObject(); // 默认序列化
// 自定义操作(如加密)
}
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
in.defaultReadObject(); // 默认反序列化
// 自定义操作(如解密)
}
版本控制(serialVersionUID)
显式声明serialVersionUID避免反序列化兼容性问题。
private static final long serialVersionUID = 1L;
注意事项
- 序列化对象需保证其所有成员均可序列化(基本类型或实现
Serializable)。 - 静态变量不会被序列化。
- 敏感数据应使用
transient或自定义序列化逻辑保护。
通过以上方法,可以灵活实现Java对象的序列化与反序列化。







