Java集合可直接序列化,前提是集合实现类(如ArrayList)及所有元素类型均实现Serializable接口;需注意transient字段、静态变量不序列化,父类也须可序列化。

Java 中集合类对象可以直接序列化保存,前提是集合本身及其中所有元素类型都满足可序列化条件。集合接口如 List、Set、Map 的常见实现类(如 ArrayList、HashSet、HashMap)本身已实现 Serializable 接口,因此只要存入的元素对象也实现了该接口,整个集合就能被完整序列化。
确保元素类型可序列化
集合只是容器,真正决定能否成功序列化的是它所装的对象。例如:
-
合法情况:往
ArrayList或ArrayList(Person实现了Serializable)中添加元素,可直接序列化。 -
非法情况:若
Person没有实现Serializable,或其中某个字段是不可序列化的类型(如Thread、Socket),则调用writeObject()时会抛出NotSerializableException。 - 建议在自定义类中显式声明
private static final long serialVersionUID = 1L;,避免因类结构微调导致反序列化失败。
使用 ObjectOutputStream 保存集合
将集合写入文件只需几行核心代码:
- 用
FileOutputStream包装目标文件路径; - 用该流构造
ObjectOutputStream; - 调用
writeObject(collection)即可——无需遍历,集合整体作为单个对象写入。
示例:out.writeObject(new ArrayList(Arrays.asList(new Person("李四", 25, "女"))));
用 ObjectInputStream 读取并还原集合
反序列化时注意类型安全:
- 读取返回的是
Object类型,需强制转换为目标集合类型,如(ArrayList;) in.readObject() - 若集合泛型信息在运行时被擦除,转换本身不检查元素类型,但若实际内容不匹配,后续操作可能抛出
ClassCastException; - 务必在
try-with-resources或finally块中关闭流,防止资源泄漏。
常见注意事项
序列化不是万能的“一键保存”,以下细节容易影响结果:
-
transient 字段会被跳过:在元素类中用
transient修饰的字段不会写入字节流,反序列化后为默认值(null、0等); -
静态变量不参与序列化:无论是否
static final,它们属于类而非实例,不会被保存; -
父类也要可序列化:若集合元素是自定义子类,且父类未实现
Serializable,则父类字段不会被序列化(除非父类提供无参构造器并配合readObject自定义逻辑); - 文件内容不可读:生成的 .ser 文件是二进制格式,不能用文本编辑器查看有效信息,这是正常现象。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











