在 Java 中,“避免序列化”通常有几种不同层面的含义。下面按常见需求场景给你系统说明。
Serializable 接口最简单、最彻底的方式:
public class User {
// 不实现 Serializable
}
⚠️ 注意:
即使父类实现了 Serializable,子类也会“继承”序列化能力。
writeReplace() 抛出错误(防继承)如果父类已实现 Serializable,但你不想让子类被序列化:
private Object writeReplace() throws ObjectStreamException {
throw new NotSerializableException("该类不允许序列化");
}
readObject() / writeObject() 抛出异常private void writeObject(ObjectOutputStream out) throws IOException {
throw new NotSerializableException();
}
private void readObject(ObjectInputStream in) throws IOException {
throw new NotSerializableException();
}
transient 关键字public class User implements Serializable {
private String name;
private transient String password; // 不会被序列化
}
✅ 常用于:
static(不会被序列化)private static int count;
⚠️ 不推荐用来“避免序列化”,语义不清。
Java 原生序列化问题很多:
| 场景 | 推荐方式 |
|---|---|
| 网络传输 | JSON(Jackson / Gson) |
| 存储 | JSON / Protobuf |
| RPC | Protobuf / Kryo |
| 缓存 | JSON / MessagePack |
示例(Jackson,不会触发 Serializable):
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(user);
✅ 对象不需要实现 Serializable
HttpSession@JsonIgnore 控制字段@JsonIgnore
private String secret;
GenericJackson2JsonRedisSerializer✅ 最佳实践:
如果你能说一下:
我可以给你更具体的方案。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。