【Java 序列化 (Serialization)】
Java 序列化 Serialization
序列化是将 Java 对象转换为字节流的过程,以便可以将其保存到文件中、通过网络传输或在内存中缓存。反序列化则是将字节流转换回 Java 对象的过程。
- serialVersionUID是一个用于验证序列化和反序列化过程中类的版本是否一致的标识符。
- Java 的序列化机制
允许类不显式声明 serialVersionUID。 - 如果没有显式定义,JVM 会根据类的结构自动计算一个 serialVersionUID(基于类名、字段、方法等)。
- 如果类的结构发生变化(如新增/删除字段),JVM 计算的 serialVersionUID也会变化,可能导致反序列化失败(InvalidClassException)。
- 不同 JVM 实现可能计算不同的 serialVersionUID,影响跨环境兼容性。
- 为了避免潜在的问题,建议始终显式声明 serialVersionUID
@Data
@AllArgsConstructor
// 可序列化的User类
public class User implements Serializable {private static final long serialVersionUID = 1L; // 序列化版本号private String name;private int age;
}
public class Main {public static void main(String[] args) {// 1. 先序列化一个User对象到文件(写入)serializeUser("C:\\Users\\admin\\Downloads\\user.dat");// 2. 从文件反序列化User对象(读取)deserializeUser("C:\\Users\\admin\\Downloads\\user.dat");}// 序列化User对象到文件private static void serializeUser(String filePath) {User user = new User("Alice");try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(filePath))) {out.writeObject(user);System.out.println("序列化成功: " + user);} catch (IOException e) {e.printStackTrace();}}// 从文件反序列化User对象private static void deserializeUser(String filePath) {try (ObjectInputStream in = new ObjectInputStream(new FileInputStream(filePath))) {User user = (User) in.readObject(); // 强制类型转换System.out.println("反序列化成功: " + user);} catch (IOException | ClassNotFoundException e) {e.printStackTrace();}}
}
