温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

java序列化原理是啥

发布时间:2026-10-25 17:01:25 来源:亿速云 阅读:94 作者:小樊 栏目:编程语言

Java 序列化(Serialization)是指把 Java 对象转换成字节流,以便存储(文件、数据库)或网络传输;反序列化(Deserialization)则是把字节流恢复成 Java 对象。

下面从原理、机制、过程、关键点几个层面说明。


一、核心原理(通俗版)

Java 序列化本质上是:

JVM 把对象的状态(成员变量)按照一定格式写成字节流,反序列化时再按格式读回来,重建对象

注意:

  • 序列化的是“对象的状态”,不是“类的方法”
  • 静态变量不会被序列化(属于类,不属于对象)
  • transient 修饰的字段不会被序列化

二、如何实现序列化

一个类要可序列化,只需:

import java.io.Serializable;

public class User implements Serializable {
    private static final long serialVersionUID = 1L;
    private String name;
    private int age;
}

关键点:

  • 实现 Serializable 接口(空接口 / 标记接口)
  • serialVersionUID 用于版本控制

三、序列化过程原理

1️⃣ 写入对象(ObjectOutputStream)

ObjectOutputStream oos = new ObjectOutputStream(
    new FileOutputStream("user.dat")
);
oos.writeObject(user);

内部流程:

  1. 检查类是否实现 Serializable
  2. 获取类描述信息(类名、字段、UID)
  3. 递归序列化对象字段
    • 基本类型 → 直接写
    • 引用类型 → 继续序列化
  4. 写入字节流

2️⃣ 字节流内容大致包括

  • 类名
  • serialVersionUID
  • 字段名 + 字段值
  • 对象引用关系

四、反序列化过程原理

ObjectInputStream ois = new ObjectInputStream(
    new FileInputStream("user.dat")
);
User user = (User) ois.readObject();

流程:

  1. 读取类名
  2. 加载类(必须 classpath 中存在)
  3. 校验 serialVersionUID
  4. 分配内存
  5. 不调用构造方法
  6. 按字节流恢复字段值

⚠️ 反序列化不会执行构造函数


五、serialVersionUID 的作用(很重要)

private static final long serialVersionUID = 1L;

作用:

  • 标识类的版本
  • 反序列化时比对 UID
  • 不一致会抛:
InvalidClassException

不写 UID 的风险:

  • 类结构一改(加字段),旧数据可能无法反序列化

六、哪些不会被序列化?

情况 是否序列化
静态变量 ❌
transient 变量 ❌
方法 ❌
普通字段 ✅

示例:

private transient String password; // 不序列化

七、自定义序列化(高级)

1️⃣ 控制序列化内容

private void writeObject(ObjectOutputStream oos) throws IOException {
    oos.defaultWriteObject();
    oos.writeUTF(encrypt(password));
}

2️⃣ 控制反序列化

private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException {
    ois.defaultReadObject();
    password = decrypt(ois.readUTF());
}

八、Java 原生序列化的问题

❌ 体积大
❌ 速度慢
❌ 不安全(反序列化漏洞)
❌ 跨语言差

所以现在常用:

  • JSON(Jackson / Gson)
  • Protobuf
  • Hessian
  • Kryo

九、一句话总结

Java 序列化就是 JVM 按规则把对象字段写成字节流,反序列化时按规则还原对象,不调用构造方法,靠 Serializable 和 serialVersionUID 保证可用性和兼容性

如果你愿意,我也可以:

  • 画一张序列化流程图
  • 讲反序列化漏洞原理
  • 对比 Java 序列化 vs JSON / Protobuf
向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手