Software Engineer · 语言与工程基础

Java 序列化:对象图、版本与不可信输入

解释 Java 对象序列化的用途、对象图身份、版本兼容与跨服务格式选择。

题目重点:解释 Java 对象序列化的用途、对象图身份、版本兼容与跨服务格式选择。

题意与假设

这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。

  • 区分 Java Serializable 协议与通用 JSON/Protobuf。默认对象序列化不等于数据库事务或可靠备份。

解题路线

  1. 序列化把状态转为可存储或传输表示;对象图可能有共享引用和环,格式需要保留或明确舍弃身份。transient 字段不会按默认字段机制持久化,恢复后要重建派生状态。
  2. serialVersionUID 用于兼容性检查,设置同一 UID 不能自动解决字段语义变化;需要迁移与旧数据测试。
  3. 反序列化可能触发类相关行为,不对不可信字节直接 ObjectInputStream。限制类型/尺寸/深度,采用可审计的结构格式并做字段验证。
  4. 跨语言接口优先显式 schema,规定默认值、未知字段、时间与数值精度;保存连接、锁和线程没有可靠业务意义。

手动走一遍

订单数据持久化只保存 orderId、货币和金额,不保存数据库连接。旧版本无 currency 时需明确默认或拒绝,而不是无声当美元。两个字段引用同一个对象时,JSON 普通树输出可能失去共享身份;需要 ID 引用或接受身份丢失。

规模与取舍

处理成本至少与输出字节/对象图规模同阶;设定深度、条数和最大消息字节,避免资源耗尽。

易错点与追问

容易失分的边界

  • 序列化能保存完整运行中的进程。
  • 同 UID 就必然兼容。
  • 把反序列化结果直接当可信业务对象。

继续深挖

  • 如何滚动升级 schema?
  • 签名与加密分别解决什么问题?
✓已复制微信号!