对象序列化是java中轻量级持久化方案,适用于单机同语言小型场景;需实现serializable接口并声明serialversionuid,用objectoutputstream写入、objectinputstream读取,但存在跨版本兼容性、安全性和性能等局限。

对象序列化是实现轻量级数据持久化的直接方式,适合单机、同语言、结构稳定的小型场景,比如配置缓存、临时状态保存、本地测试数据存储等。它不依赖数据库,也不需要建表或ORM映射,只需几行代码就能把内存对象“快照”到文件中,下次启动时再还原。
一、核心前提:类必须可序列化
Java 中,目标类需显式实现 Serializable 接口,并建议手动声明 serialVersionUID:
- 不加
Serializable→ 运行时报NotSerializableException - 不写
serialVersionUID→ 类字段稍作修改(如增删字段)就可能反序列化失败,抛出InvalidClassException - 敏感字段(如密码、token)用
transient修饰,避免被意外存入文件
二、写出对象:用 ObjectOutputStream 写入文件
本质是包装一个底层字节流(如 FileOutputStream),然后调用 writeObject():
- 必须用
try-with-resources或手动close(),否则可能只写入部分头信息,导致后续读取失败 - 输出的是二进制内容,人不可读,也不应手动编辑
- 支持连续写入多个对象(但读取时需按相同顺序逐个
readObject())
三、读取对象:用 ObjectInputStream 恢复实例
从同一文件创建 ObjectInputStream,调用 readObject() 并强制转为原类型:
- 反序列化返回的是
Object,必须强转,否则编译不通过 - 若文件为空、损坏或版本不匹配,会抛出
IOException或ClassNotFoundException,需捕获处理 - 不能跨 Java 大版本(如 JDK 17 序列化的对象,在 JDK 21 可能因内部格式调整而失败)
四、注意它不是万能方案
原生序列化适合“临时快照”,但不适合生产环境的业务数据存储:
- 仅限 Java 生态,其他语言无法解析
- 二进制格式不可调试、不可审计、无法做增量更新或查询
- 含线程、Socket、数据库连接等资源的对象无法序列化
- 存在反序列化安全风险(尤其加载不受信数据时)
- 性能一般,远不如 JSON/Protobuf 等现代序列化格式










