尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

【Java踩坑笔记】49_序列化版本号serialVersionUID不写会怎样?

【Java踩坑笔记】49_序列化版本号serialVersionUID不写会怎样?
📅 发布时间:2026/7/16 23:59:14

49 | 序列化版本号 serialVersionUID 不写会怎样?

摘要:Serializable类不写serialVersionUID,JVM 会根据类结构自动生成一个。类结构稍有变化,自动生成的 UID 就变了,反序列化直接失败。


一、问题现象

// ❌ 没写 serialVersionUIDclassUserimplementsSerializable{privateLongid;privateStringname;}

把对象序列化到文件,然后给User加一个字段:

classUserimplementsSerializable{privateLongid;privateStringname;privateIntegerage;// 新增字段}

再反序列化:InvalidClassException。


二、踩坑现场

场景:微服务间用 JDK 序列化传输

// ❌ 没写 serialVersionUID,发版后反序列化失败classOrderDTOimplementsSerializable{privateLongorderId;privateLonguserId;}

服务 A 发版(加了字段),服务 B 没发版,服务 B 反序列化失败。


三、原理解析

3.1 serialVersionUID 的作用

// 反序列化时会检查:// 字节流里的 serialVersionUID == 当前类的 serialVersionUID?// 相等 → 继续反序列化// 不相等 → InvalidClassException

3.2 不写时 JVM 怎么生成?

JVM 根据类的结构(字段、方法、修饰符…)计算一个哈希值。

问题:只要类结构稍有变化(加字段、改方法),哈希值就变。

// 版本 1(没写 serialVersionUID)classUserimplementsSerializable{privateLongid;}// 版本 2(加字段,自动生成的 UID 变了)classUserimplementsSerializable{privateLongid;privateStringname;// 新增}// 反序列化版本 1 的字节流 → InvalidClassException

四、正确写法

4.1 实现 Serializable 就写 serialVersionUID

// ✅ 正确:明确指定 serialVersionUIDclassUserimplementsSerializable{privatestaticfinallongserialVersionUID=1L;privateLongid;privateStringname;}

版本兼容规则:

  • 字段只增不减 →serialVersionUID不变,反序列化兼容
  • 字段删除或类型改变 →serialVersionUID+1,不兼容

4.2 IDEA 自动生成

右键 → Generate → serialVersionUID
(需开启Serializable class without serialVersionUID警告)

4.3 不需要 JDK 序列化的场景

// ✅ JSON 序列化(Jackson)不依赖 serialVersionUID// 所以 DTO 如果只用 JSON 传输,不写也没关系classUser{privateLongid;privateStringname;}

但:如果不确定未来会不会用 JDK 序列化(如放入HttpSession、用ObjectOutputStream),还是写上。


五、最佳实践

✅ Serializable 使用的 3 条铁律

  1. 实现Serializable必须写serialVersionUID
  2. 字段只增不减时serialVersionUID不变(兼容)
  3. 如果确定只用 JSON 序列化,可以不写(但写上更保险)

🔍 如何快速发现漏写?

IDEA 开启Serializable class without serialVersionUID警告(默认开启)。


六、小结

  • 不写serialVersionUID,JVM 根据类结构自动生成
  • 类结构稍有变化,自动生成的 UID 就变,反序列化失败
  • 实现Serializable必须写serialVersionUID
  • 字段只增不减 → UID 不变(兼容)
  • JSON 序列化(Jackson)不依赖serialVersionUID

第七辑完。—— 下一篇进入第八辑:综合实战篇,首篇:一次生产 OOM 排查实录。

相关新闻

  • 【Atlas】HBase 表设计对 Atlas 性能有何影响?如何调优?
  • 从SQL查询到数据洞察:SQLPad如何重构数据库交互体验
  • 别急着签合同!2026年广州建站平台推荐,先看这4个细节

最新新闻

  • 2026天津大型废弃物存储柜售后口碑排行榜单 - 奔跑123
  • 【完美复现】功率阶跃工况光储 VSG 并网电能质量自适应治理策略(Simulink仿真实现)
  • 300斤大件包裹怎么寄最划算?深度解析物流成本与省钱策略 - 快递物流资讯
  • 伯爵中国官方售后服务中心|服务热线及完整地址权威信息通告(2026年7月更新) - 亨得利钟表维修中心
  • 2026年上海环氧地坪厂家推荐综合实力排行汇总 - 奔跑123
  • 山东牛皮沙发品牌质量排行 核心实测指标全对比 - 奔跑123

日新闻

  • 佛山青少年训练营推荐:军博营地实力顶尖 - 秋山寄远
  • 如何快速上手PvZ2 Gardendless:免费Web版植物大战僵尸2完整指南
  • jiuwen-deepsearch核心功能详解:规划-检索-反思三合一智能工作流

周新闻

  • IX9104 PCIe5.0 高速交换芯片@ACP#完整规格 + 应用场景总结
  • Unity游戏集成Coze智能体:实现NPC智能对话与知识库联动
  • SAP EPIC 建行回单查询:从标准类CL_EPIC_EXAMPLE_CN_CCB_GHTD到Z类的5处关键修改

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号