题目重点:解释 Java 对象序列化的用途、对象图身份、版本兼容与跨服务格式选择。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 区分 Java Serializable 协议与通用 JSON/Protobuf。默认对象序列化不等于数据库事务或可靠备份。
解题路线
- 序列化把状态转为可存储或传输表示;对象图可能有共享引用和环,格式需要保留或明确舍弃身份。transient 字段不会按默认字段机制持久化,恢复后要重建派生状态。
- serialVersionUID 用于兼容性检查,设置同一 UID 不能自动解决字段语义变化;需要迁移与旧数据测试。
- 反序列化可能触发类相关行为,不对不可信字节直接 ObjectInputStream。限制类型/尺寸/深度,采用可审计的结构格式并做字段验证。
- 跨语言接口优先显式 schema,规定默认值、未知字段、时间与数值精度;保存连接、锁和线程没有可靠业务意义。
手动走一遍
订单数据持久化只保存 orderId、货币和金额,不保存数据库连接。旧版本无 currency 时需明确默认或拒绝,而不是无声当美元。两个字段引用同一个对象时,JSON 普通树输出可能失去共享身份;需要 ID 引用或接受身份丢失。
规模与取舍
处理成本至少与输出字节/对象图规模同阶;设定深度、条数和最大消息字节,避免资源耗尽。
易错点与追问
容易失分的边界
- 序列化能保存完整运行中的进程。
- 同 UID 就必然兼容。
- 把反序列化结果直接当可信业务对象。
继续深挖
- 如何滚动升级 schema?
- 签名与加密分别解决什么问题?
