Serializable是 Java 中用于对象序列化的接口。序列化是将对象的状态转换为字节流的过程,以便存储或传输。反序列化则是将字节流恢复为对象的过程。
Serializable 接口没有任何方法或字段,仅用于标识一个类的对象是可序列化的,实现了Serializable接口的类可以被ObjectOutputStream转换为字节流,同时也可以通过ObjectInputStream再将其解析为对象(前提实现 Serializable 接口)。
// 序列化
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("user.ser"));
out.writeObject(user);
out.close();
// 反序列化
ObjectInputStream in = new ObjectInputStream(new FileInputStream("user.ser"));
User user = (User) in.readObject();
in.close();
什么时候需要实现呢?
序列化的场景就是当你需要保存对象,或者通过网络把对象传输到其他地方的时候,类必须实现 Serializable 才能将其对象序列化为字节流。
private static final long serialVersionUID = 1L;
serialVersionUID 是用于验证序列化和反序列化过程中类的一致性。JVM在反序列化时会比较传入字节流中的serialVersionUID与本地类的serialVersionUID,如果一致则认为是兼容的,可以进行反序列化,否则会抛出 InvalidClassException 异常。
定义 private static final long serialVersionUID = 1L; 可以确保类在版本变化时的兼容性,避免反序列化时出现版本不一致的错误。显式定义serialVersionUID是一个良好的编程实践,特别是在需要频繁序列化和反序列化的场景中。