温馨提示×

温馨提示×

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

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

java序列化有哪些坑点

发布时间:2026-09-14 10:22:41 来源:亿速云 阅读:86 作者:小樊 栏目:编程语言

Java 序列化(Java Serialization,基于 java.io.Serializable)在实际项目中坑非常多,下面按「常见程度 + 危害性」系统性总结:


一、安全相关坑(最严重)

1. 反序列化漏洞(RCE)

  • 反序列化时会自动执行 readObject() / 构造函数逻辑
  • 攻击者可构造恶意对象,触发远程代码执行
  • 典型漏洞:
    • Apache Commons Collections
    • Fastjson(早期)
    • Jackson 不当配置

✅ 建议:

  • 不要用 Java 原生序列化做跨网络传输
  • 使用 JSON / Protobuf
  • 白名单反序列化(ObjectInputFilter

2. 可被反序列化任意类

  • 只要类在 classpath 中且实现 Serializable
  • 就可能被构造攻击对象

✅ 建议:

  • 限制可反序列化类
  • 避免暴露内部对象

二、兼容性与版本坑

3. serialVersionUID 不一致

private static final long serialVersionUID = 1L;
  • 不写:JVM 自动生成(非常脆弱)
  • 类结构一变 → InvalidClassException

✅ 建议:

  • 必须显式声明
  • 不随便修改

4. 字段增减导致不兼容

  • 删除字段 → 旧数据无法反序列化
  • 修改字段类型 → 直接失败

✅ 建议:

  • 序列化对象只放「DTO」
  • 不直接序列化 Entity / Domain

5. 继承结构变化

  • 父类未实现 Serializable
  • 子类实现 → 父类字段不会被序列化

三、性能坑

6. 性能极差

  • 比 JSON 慢
  • 比 Protobuf / Kryo 慢一个数量级
  • 生成字节大

✅ 建议:

  • 高频 / 大数据量避免原生序列化

7. 反射 + IO 双重开销

  • 序列化过程大量反射
  • GC 压力大

四、设计坑

8. 序列化破坏单例

readResolve()
  • 反序列化会创建新对象
  • 单例失效

✅ 解决:

private Object readResolve() {
    return INSTANCE;
}

9. 破坏封装

  • 私有字段被外部直接恢复
  • 校验逻辑被绕过

10. 静态变量不会序列化

static int count;
  • 静态字段不属于对象状态
  • 容易误以为会被保存

五、隐藏逻辑坑

11. transient 使用不当

  • 忘记标 transient
    • 密码、密钥被写入磁盘 / 网络
  • 标了但没恢复逻辑
    • 对象状态不完整

12. readObject() 自定义逻辑易出错

private void readObject(ObjectInputStream s) {
    s.defaultReadObject();
    // 容易忘记校验
}

❌ 常见错误:

  • 不校验参数
  • 构造不完整对象

六、框架 & 使用坑

13. 和 ORM 混用灾难

  • Hibernate Entity 直接序列化
  • 懒加载报错
  • 循环引用 StackOverflow

✅ 必须用 DTO


14. 分布式场景坑

  • Redis / MQ 用 Java 序列化
  • 多版本服务不兼容
  • 升级即炸

七、现代替代方案(强烈推荐)

场景 推荐
RPC Protobuf / Kryo
HTTP JSON
缓存 JSON / MsgPack
本地持久化 JSON / SQLite

总结一句话

Java 原生序列化:能不用就不用,用了必踩坑。

如果你愿意,我可以:

  • 给你一个 安全序列化示例
  • 对比 Java vs JSON vs Protobuf
  • 为什么 Java 序列化被官方“放弃”
向AI问一下细节

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

AI