ArrayList本身可序列化,需过滤的是其泛型元素中的字段;应使用transient修饰、自定义writeObject/readObject方法,或用Jackson/Gson等框架注解控制,优先采用DTO设计避免敏感字段进入集合。

Java 中 ArrayList 本身是可序列化的(实现了 Serializable),但真正需要过滤字段的,通常是它所存储的**自定义对象元素**。也就是说,不是 ArrayList 本身有“多余字段”,而是它的泛型元素类里存在不想被序列化的字段。
用 transient 关键字标记不参与序列化的字段
这是最直接、标准的方式。在你的实体类中,把不需要序列化的字段声明为 transient:
- 被
transient修饰的字段在默认 Java 序列化(ObjectOutputStream)时会被自动跳过 - 适用于简单场景,无需额外依赖或配置
- 注意:反序列化后,
transient字段值为默认值(如null、0、false)
public class User implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private int age;
private transient String tempCache; // 不会写入序列化流
private transient List<String> internalState; // 同样被忽略
}
实现 writeObject 和 readObject 自定义序列化逻辑
当需要更精细控制(比如动态决定是否序列化某个字段,或序列化前做转换),可手动实现私有方法:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
private void writeObject(ObjectOutputStream out)替代默认序列化流程 -
private void readObject(ObjectInputStream in)配合使用,确保字段正确恢复 - 记得先调用
defaultWriteObject()/defaultReadObject()处理非 transient 字段
private void writeObject(ObjectOutputStream out) throws IOException {
out.defaultWriteObject(); // 序列化非 transient 字段
// 手动跳过 sensitiveData,或加密后再写入
}
换用 JSON 或其他序列化框架(如 Jackson、Gson)并用注解控制
如果项目中实际用的是 JSON(比如 Spring Web 返回列表),那 Java 原生序列化不生效,应使用对应框架的注解:
立即学习“Java免费学习笔记(深入)”;
- Jackson:用
@JsonIgnore、@JsonIgnoreProperties或@JsonInclude(JsonInclude.Include.NON_NULL) - Gson:用
@Expose(serialize = false)(需配置GsonBuilder.excludeFieldsWithoutExposeAnnotation()) - 这些注解只影响该框架行为,对
ObjectOutputStream无效
public class User {
private String name;
private int age;
@JsonIgnore
private String authToken; // JSON 序列化时忽略
}
避免将敏感/临时对象放入 ArrayList —— 从设计源头过滤
比“序列化时过滤”更干净的做法,是让 ArrayList 只装真正需要持久化或传输的数据:
- 创建专门的 DTO(Data Transfer Object)类,仅包含必要字段,用构造器或 MapStruct 等工具转换
- 不要把带缓存、上下文、监听器等运行时字段的原始业务对象直接丢进 ArrayList 传给序列化层
- 尤其注意:内部类、持有 Activity/Context 的对象(Android)、或含线程局部变量的对象,都可能引发序列化异常或泄露

















