最直接有效的方式是在子类中显式定义private void writeObject(ObjectOutputStream)并抛出NotSerializableException;因父类已实现Serializable,子类自动继承可序列化能力,仅去掉接口声明无效。

如果父类实现了 Serializable 接口,但子类**不希望被序列化**,最直接有效的方式是:在子类中**显式定义 `private void writeObject(ObjectOutputStream)` 方法,并在其中抛出 `NotSerializableException`**。
为什么不能只去掉 `Serializable` 接口?
因为父类已实现 Serializable,子类会自动继承可序列化能力(Java 序列化机制只检查类及其祖先是否可序列化,不强制子类自己声明)。即使子类没写 implements Serializable,只要父类可序列化,子类默认就可序列化。
正确做法:重写序列化钩子方法
在子类中添加以下私有方法:
private void writeObject(ObjectOutputStream out) throws IOException {
throw new NotSerializableException("SubClass is not allowed to be serialized");
}
这个方法会在序列化时被 JVM 自动调用(通过反射),从而阻断序列化流程。注意必须是 private、void 返回、参数为 ObjectOutputStream,且不能声明为 throws Exception(只能是 IOException 或其子类)。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
配套建议:同时禁用反序列化
为防反序列化绕过,建议一并重写反序列化钩子:
private void readObject(ObjectInputStream in) throws IOException { throw new InvalidClassException("SubClass is not deserializable"); }- 还可以加上
private void readObjectNoData() throws ObjectStreamException(处理流中无数据的情况)
其他注意事项
该方案对标准 Java 序列化(ObjectOutputStream / ObjectInputStream)有效;但对 JSON、XML 等第三方序列化框架(如 Jackson、Gson)无效——它们不走 Java 原生序列化钩子,需另行配置(例如 Jackson 中用 @JsonIgnoreType 或自定义序列化器)。

















