Java 序列化(Serialization)本质上是把“存活在内存中的 Java 对象”转换成“可存储或可传输的字节序列”,并在需要时再还原为对象。之所以需要它,主要有以下几类原因:
ObjectOutputStream oos = new ObjectOutputStream(
new FileOutputStream("user.obj"));
oos.writeObject(user);
Java对象 → 序列化 → 字节流 → 网络 → 反序列化 → Java对象
对象作为参数或返回值在网络中传输
Object → 序列化 → byte[] → Redis
✅ 序列化解决的问题:
public class User implements Serializable {
private String name;
private int age;
}
Serializable 是标记接口(无方法)private static final long serialVersionUID = 1L;
作用:
InvalidClassExceptionprivate transient String password;
transient 修饰的字段不会被序列化虽然需要序列化,但不一定用 Java 原生序列化:
| 问题 | 说明 |
|---|---|
| 安全性差 | 反序列化可导致远程代码执行 |
| 性能差 | 序列化后体积大、速度慢 |
| 跨语言差 | 其他语言难以解析 |
| 强耦合 | 与 Java 类结构强绑定 |
| 场景 | 推荐 |
|---|---|
| RPC | Protobuf、Thrift、JSON |
| HTTP 接口 | JSON(Jackson / Gson) |
| 缓存 | JSON / Protobuf |
| 跨语言 | JSON / Protobuf / Avro |
需要 Java 序列化,是因为对象不能脱离 JVM 存在;
序列化让对象可以“离开内存”,去磁盘、去网络、去另一个 JVM。”
如果你愿意,我也可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。