java对象序列化需类实现serializable接口并声明serialversionuid,用objectoutputstream写入、objectinputstream读取,transient和static字段不参与,集合可整体序列化但需元素均可序列化。

Java 中将对象保存到文件,本质是通过序列化(Serialization)把对象转成字节流,再写入磁盘。关键不是“怎么存”,而是“怎么让 JVM 认可并正确处理这个过程”——前提是类可序列化,操作流要规范,细节不注意就容易失败。
类必须实现 Serializable 接口
这是硬性门槛。没实现这个接口,调用 writeObject() 时会直接抛 NotSerializableException。
- 只需在类声明后加 implements Serializable,它是个空标记接口,不提供任何方法
- 强烈建议手动声明 private static final long serialVersionUID = 1L;,否则 JVM 自动生成的 ID 会随类结构微调而变化,导致反序列化时报 InvalidClassException
- 字段若不想保存(比如密码、临时计算结果),用 transient 修饰;static 字段天生不参与序列化,因为不属于对象实例状态
用 ObjectOutputStream 写入文件
它负责把对象“翻译”成字节,并灌进文件。不能直接操作 FileOutputStream,必须包一层 ObjectOutputStream。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 创建 FileOutputStream 指向目标文件(如 "user.dat")
- 用它构造 ObjectOutputStream
- 调用 writeObject(obj) —— 支持单个对象,也支持整个集合(如 ArrayList),只要集合里每个元素都可序列化
- 务必用 try-with-resources 自动关闭流,避免资源泄漏或文件损坏
读取时用 ObjectInputStream 还原对象
反序列化是写入的逆过程,但更脆弱:文件损坏、类版本不匹配、路径错误都会中断。
- 用 FileInputStream 打开同一文件,再包装成 ObjectInputStream
- 调用 readObject(),返回类型是 Object,需强制转为原始类型(如 (User) ois.readObject())
- 必须捕获 ClassNotFoundException(类不在 classpath)和 IOException(文件不存在、权限不足、内容被篡改等)
- 写入和读取顺序必须严格一致:先写 A 再写 B,就得先读 A 再读 B
集合批量保存更简单
ArrayList、HashSet 等集合类本身已实现 Serializable,只要里面所有元素都可序列化,就能一行代码搞定:
- oos.writeObject(userList); —— 直接把整个 List 当作一个对象写入
- 读取时 (List
) ois.readObject(); 即可还原,泛型信息虽被擦除,但实际类型由序列化时决定 - 注意:如果后续修改了 User 类(比如删字段、改类型),且没更新 serialVersionUID,反序列化大概率失败
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










