温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何避免java序列化

发布时间:2026-10-05 02:36:25 来源:亿速云 阅读:89 作者:小樊 栏目:编程语言

在 Java 中,“避免序列化”通常有几种不同层面的含义。下面按常见需求场景给你系统说明。


一、完全禁止某个类被序列化(最常见)

1. 不实现 Serializable 接口

最简单、最彻底的方式:

public class User {
    // 不实现 Serializable
}

⚠️ 注意:
即使父类实现了 Serializable,子类也会“继承”序列化能力。


2. 使用 writeReplace() 抛出错误(防继承)

如果父类已实现 Serializable,但你不想让子类被序列化:

private Object writeReplace() throws ObjectStreamException {
    throw new NotSerializableException("该类不允许序列化");
}

3. 使用 readObject() / writeObject() 抛出异常

private void writeObject(ObjectOutputStream out) throws IOException {
    throw new NotSerializableException();
}

private void readObject(ObjectInputStream in) throws IOException {
    throw new NotSerializableException();
}

二、只让“部分字段”不序列化

1. 使用 transient 关键字

public class User implements Serializable {
    private String name;
    private transient String password; // 不会被序列化
}

✅ 常用于:

  • 密码
  • 缓存
  • 线程、连接对象

2. 使用 static(不会被序列化)

private static int count;

⚠️ 不推荐用来“避免序列化”,语义不清。


三、使用“更现代的替代方案”(强烈推荐)

✅ 不要用 Java 原生序列化

Java 原生序列化问题很多:

  • 安全问题(反序列化漏洞)
  • 性能差
  • 版本不兼容

推荐替代方案

场景 推荐方式
网络传输 JSON(Jackson / Gson)
存储 JSON / Protobuf
RPC Protobuf / Kryo
缓存 JSON / MessagePack

示例(Jackson,不会触发 Serializable):

ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(user);

✅ 对象不需要实现 Serializable


四、框架层面的“禁止序列化”

Spring 中

  • 不把对象放进 HttpSession
  • 使用 @JsonIgnore 控制字段
@JsonIgnore
private String secret;

Redis 中

  • 使用 JSON 而不是 JDK 序列化
  • 配置 GenericJackson2JsonRedisSerializer

五、总结建议

✅ 最佳实践:

  1. 新项目:不要使用 Java 原生序列化
  2. 必须序列化时:避免敏感字段 + 使用 JSON
  3. 禁止序列化:不实现 Serializable + 抛异常

如果你能说一下:

  • 是 安全角度 还是 性能角度
  • 用在 RPC / Redis / Session / 文件

我可以给你更具体的方案。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手