java类如何序列化
序列化的基本概念
Java序列化是将对象转换为字节流的过程,便于存储或传输。反序列化则是将字节流恢复为对象。Java通过java.io.Serializable接口实现序列化机制。
实现序列化的步骤
让类实现Serializable接口
需要序列化的类必须实现java.io.Serializable接口,这是一个标记接口,没有需要实现的方法。
public class Person implements Serializable {
private String name;
private int age;
// 构造方法、getter和setter
}
使用ObjectOutputStream进行序列化
通过ObjectOutputStream将对象写入文件或网络流。

Person person = new Person("Alice", 30);
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.ser"))) {
oos.writeObject(person);
} catch (IOException e) {
e.printStackTrace();
}
使用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();
}
序列化ID的作用
serialVersionUID用于标识序列化类的版本。若未显式声明,JVM会自动生成,但类结构变化可能导致反序列化失败。建议显式定义:

private static final long serialVersionUID = 1L;
控制序列化字段
使用transient关键字标记不需要序列化的字段:
private transient String password; // 该字段不会被序列化
自定义序列化过程
通过实现writeObject和readObject方法自定义序列化逻辑:
private void writeObject(ObjectOutputStream out) throws IOException {
out.defaultWriteObject(); // 默认序列化
// 自定义操作
}
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
in.defaultReadObject(); // 默认反序列化
// 自定义操作
}
序列化注意事项
- 序列化会保存对象的状态,但不会保存静态变量(属于类而非对象)。
- 父类若实现
Serializable,子类自动可序列化;若父类未实现,子类需负责序列化父类状态。 - 内部类的序列化行为复杂,通常建议避免序列化非静态内部类。






