我用最清晰、最实用、可直接运行的方式,教你Java 反序列化到底怎么写、怎么用、注意什么

一、什么是反序列化?

字节流(文件/网络数据) 重新变回 Java 对象的过程。

需要两个核心类:

  • FileInputStream:读取字节数据
  • ObjectInputStream:把字节还原为对象

二、反序列化 完整步骤 + 代码

1. 前提:类必须实现 Serializable

import java.io.Serializable;

public class User implements Serializable {
    // 必须加,否则改类就无法反序列化
    private static final long serialVersionUID = 1L;

    private String name;
    private int age;
    private transient String password; // 不会被序列化
    
    // getter、setter、toString
}

2. 反序列化代码(直接复制就能用)

import java.io.FileInputStream;
import java.io.ObjectInputStream;

public class DeserializeDemo {
    public static void main(String[] args) {
        try (
            FileInputStream fis = new FileInputStream("user.obj");
            ObjectInputStream ois = new ObjectInputStream(fis)
        ) {
            // 核心:反序列化
            User user = (User) ois.readObject();

            System.out.println("反序列化成功!");
            System.out.println("姓名:" + user.getName());
            System.out.println("年龄:" + user.getAge());
            System.out.println("密码:" + user.getPassword()); // null(transient)

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

三、反序列化 执行结果

反序列化成功!
姓名:张三
年龄:20
密码:null
  • passwordtransient → 反序列化后为 null
  • 静态变量不会恢复
  • 只有被序列化的字段才会恢复

四、反序列化的 3 个必须条件

  1. 类必须实现 Serializable
  2. 必须有相同的 serialVersionUID
    不一样会直接报错:
    java.io.InvalidClassException
    
  3. 类结构不能发生不兼容变化(例如删除字段、改类型)

五、最常见报错原因

  1. 没有 serialVersionUID
  2. 序列化前后 UID 变了
  3. 类结构修改(字段改名/删字段)
  4. 类路径不对 / 找不到类
  5. 数据被篡改

六、最简单记忆口诀

序列化:ObjectOutputStream.writeObject(对象)
反序列化:ObjectInputStream.readObject() 强转回对象

七、一句话总结

反序列化就是:读取字节流 → 还原成 Java 对象,必须保证类兼容、UID一致、实现Serializable。

更多推荐