温馨提示×

温馨提示×

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

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

为何需要Java序列化

发布时间:2026-07-24 09:41:16 来源:亿速云 阅读:106 作者:小樊 栏目:编程语言

Java 序列化(Serialization)本质上是把“存活在内存中的 Java 对象”转换成“可存储或可传输的字节序列”,并在需要时再还原为对象。之所以需要它,主要有以下几类原因:


一、核心目的:对象状态的持久化与传输

1. 对象持久化(保存到磁盘)

  • 内存中的对象在程序结束后会消失
  • 序列化可以把对象保存到文件、数据库、缓存中
  • 典型场景:
    • 保存会话信息
    • 保存用户配置
    • 保存计算结果
ObjectOutputStream oos = new ObjectOutputStream(
        new FileOutputStream("user.obj"));
oos.writeObject(user);

2. 网络传输(跨进程 / 跨机器)

  • Java 对象不能直接在网络中传输
  • 序列化后变成字节流,可以通过:
    • Socket
    • HTTP
    • RPC 框架
    • 消息队列
Java对象 → 序列化 → 字节流 → 网络 → 反序列化 → Java对象

二、典型使用场景

1. RPC / 分布式系统

  • 早期 Java RPC(如 RMI)
  • Dubbo(早期支持 Java 原生序列化)
  • 微服务之间传递对象

对象作为参数或返回值在网络中传输


2. 缓存系统

  • Redis / Ehcache / Memcached
  • 把对象序列化后存入缓存
Object → 序列化 → byte[] → Redis

3. 会话管理(Session)

  • Tomcat Session 持久化
  • 分布式 Session(Session 复制到另一台服务器)

4. 深拷贝(不推荐但可行)

  • 通过序列化 + 反序列化实现对象深拷贝

三、为什么非序列化不行?

内存对象 ≠ 可存储/可传输

  • 内存对象包含:
    • 引用地址
    • 堆栈信息
    • JVM 私有结构
  • 这些不能直接写到磁盘或网络

✅ 序列化解决的问题:

  • 定义对象如何变成字节
  • 保证对象结构、字段值、类型信息不丢失

四、Java 序列化的基本机制

1. 实现 Serializable 接口

public class User implements Serializable {
    private String name;
    private int age;
}
  • Serializable 是标记接口(无方法)
  • 告诉 JVM:这个对象可以被序列化

2. serialVersionUID(重要)

private static final long serialVersionUID = 1L;

作用:

  • 保证序列化和反序列化时类版本一致
  • 防止 InvalidClassException

3. transient 关键字

private transient String password;
  • 被 transient 修饰的字段不会被序列化

五、为什么现在“不推荐” Java 原生序列化?

虽然需要序列化,但不一定用 Java 原生序列化:

Java 原生序列化的问题

问题 说明
安全性差 反序列化可导致远程代码执行
性能差 序列化后体积大、速度慢
跨语言差 其他语言难以解析
强耦合 与 Java 类结构强绑定

六、现代替代方案(更常用)

场景 推荐
RPC Protobuf、Thrift、JSON
HTTP 接口 JSON(Jackson / Gson)
缓存 JSON / Protobuf
跨语言 JSON / Protobuf / Avro

七、一句话总结

需要 Java 序列化,是因为对象不能脱离 JVM 存在;
序列化让对象可以“离开内存”,去磁盘、去网络、去另一个 JVM。”

如果你愿意,我也可以:

  • 对比 Java 序列化 vs JSON vs Protobuf
  • 讲解反序列化漏洞原理
  • 给你一个完整的序列化示例或面试回答版本
向AI问一下细节

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

AI
助
手