Java中反序列化ArrayList的核心是用ObjectInputStream读取ObjectOutputStream保存的文件,要求ArrayList及其元素均实现Serializable接口,且需处理serialVersionUID匹配、类路径一致及异常捕获等问题。

Java 中从文件反序列化读取 ArrayList,核心是使用 ObjectInputStream 配合之前用 ObjectOutputStream 序列化保存的文件。前提是该 ArrayList 及其元素类型都实现了 Serializable 接口。
确保类可序列化
被存入 ArrayList 的每个对象(比如自定义的 User、Product)必须实现 Serializable 接口,否则反序列化会抛出 NotSerializableException:
// 示例:可序列化的实体类
public class User implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private int age;
// 构造、getter、setter 略
}
用 ObjectInputStream 读取 ArrayList
打开文件输入流,包装成 ObjectInputStream,然后直接 readObject() 并强转为 ArrayList:
立即学习“Java免费学习笔记(深入)”;
- 文件路径必须与序列化时一致,且文件未被损坏或手动修改
- 读取后需做类型检查或
instanceof判断,避免ClassCastException - 推荐使用 try-with-resources 自动关闭流
// 示例代码
File file = new File("users.dat");
ArrayList<User> list = null;
try (FileInputStream fis = new FileInputStream(file);
ObjectInputStream ois = new ObjectInputStream(fis)) {
Object obj = ois.readObject();
if (obj instanceof ArrayList) {
list = (ArrayList<User>) obj;
}
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
常见问题与注意事项
反序列化失败多数源于环境不一致:
-
serialVersionUID不匹配:类修改后未更新该字段,会导致InvalidClassException - 类路径变化:运行时找不到对应类(如打包后类名/包名不一致),抛
ClassNotFoundException - 文件为空或不是合法序列化数据:会触发
StreamCorruptedException或EOFException -
ArrayList里含不可序列化对象(如含Thread、Socket):序列化阶段就失败,不会留到反序列化才报错
替代方案建议(更安全可靠)
生产环境通常不推荐直接用 Java 原生序列化,因为兼容性差、安全性低、跨语言不支持。可考虑:
- 用 JSON(如 Jackson 或 Gson)存为文本文件,再解析为
List<T> - 用 CSV 或 XML(适合结构简单、字段固定的数据)
- 用数据库(如 SQLite 文件)存储,避免序列化/反序列化负担


















