0

0

如何在Java中防止对象被序列化_实现readObject抛出异常

P粉602998670

P粉602998670

发布时间:2026-02-25 14:04:33

|

298人浏览过

|

来源于php中文网

原创

readobject抛异常能阻止反序列化,因其在反序列化初始阶段主动中断流程,跳过字段还原;但仅对本类生效,需严格匹配签名、正确声明异常,且依赖serialversionuid一致才触发。

如何在java中防止对象被序列化_实现readobject抛出异常

为什么 readObject 抛异常能阻止反序列化

Java 反序列化流程中,只要类实现了 Serializable,JVM 就会尝试调用其私有的 readObject 方法(如果存在)来重建对象。你主动定义它并抛异常,等于在反序列化链最开始就掐断执行——不是“不让序列化”,而是“一读就炸”,连字段还原都跳过。

注意:这只能防反序列化,不影响 writeObject 或正常构造;且仅对本类生效,不阻止子类或代理类绕过。

  • 必须声明为 private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException,签名错一个字(比如少 throws 或参数类型不对)就无效
  • 异常必须是 IOExceptionClassNotFoundException 的实例,抛 RuntimeException 会被 JVM 吞掉或转成 InvalidClassException,行为不可控
  • 方法体第一行建议加 throw new InvalidClassException("Deserialization is not allowed");,比 new RuntimeException() 更明确

如何让 readObject 真正生效而不被忽略

IDE 自动生成的 readObject 常漏掉关键细节,导致你以为挡住了,其实没拦住。最常见原因是:没调用 in.defaultReadObject() 之前就抛异常——但这不是问题,反而是正确姿势;真正失效的情况是方法根本没被识别到。

  • 方法必须严格匹配签名:private void readObject(ObjectInputStream in),不能是 public、不能带多余参数、不能返回值
  • 类不能是 record(Java 14+),record 的序列化逻辑绕过自定义 readObject
  • 如果父类也定义了 readObject,子类必须显式重写,否则继承父类逻辑(可能不抛异常)
  • 使用 serialver 工具检查 serialVersionUID 是否一致,版本不匹配时可能跳过该方法

readObjectserialVersionUID 配合使用的实际效果

serialVersionUID 本身不阻止反序列化,但它和 readObject 是组合技:前者控制“是否允许跨版本读”,后者控制“读到一半就终止”。两者一起用,才能覆盖更多攻击面。

Cogniflow
Cogniflow

Cogniflow是一个无代码AISaas解决方案,允许用户创建和部署AI模型,

下载

立即学习Java免费学习笔记(深入)”;

  • 不设 serialVersionUID 时,JVM 自动生成,但类结构稍变(比如加个字段)就会导致 InvalidClassException,这时你的 readObject 根本不会被执行
  • 显式声明 private static final long serialVersionUID = 1L; 后,JVM 才会走到 readObject 这一步,你的异常才有机会抛出
  • 如果目标是彻底禁用,建议把 serialVersionUID 设成随机大数(如 0xDEADBEEFL),再配合 readObject 抛异常,双重保险

哪些场景下 readObject 会失效

它不是银弹。遇到反射调用、第三方序列化库(如 Kryo、Jackson)、或 ObjectInputStream 被包装/重写时,这个钩子大概率被跳过。

  • Spring 的 GenericJackson2JsonRedisSerializer 不走 Java 原生序列化,readObject 完全无效
  • Apache Commons Collections 等老漏洞利用链,常通过 AnnotationInvocationHandler 等内置可序列化类做跳板,你的业务类哪怕写了 readObject 也拦不住
  • 使用 Unsafe.allocateInstance() + 字段反射直接构造对象,完全绕过反序列化流程
  • 如果类还实现了 Externalizable,则 readObject 被忽略,必须改用 readExternal

真正难防的是那些不经过 ObjectInputStream 的路径。别只盯着 readObject,得看清楚你用的到底是不是原生序列化。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

144

2025.08.06

Java Spring Security 与认证授权
Java Spring Security 与认证授权

本专题系统讲解 Java Spring Security 框架在认证与授权中的应用,涵盖用户身份验证、权限控制、JWT与OAuth2实现、跨站请求伪造(CSRF)防护、会话管理与安全漏洞防范。通过实际项目案例,帮助学习者掌握如何 使用 Spring Security 实现高安全性认证与授权机制,提升 Web 应用的安全性与用户数据保护。

81

2026.01.26

javascriptvoid(o)怎么解决
javascriptvoid(o)怎么解决

javascriptvoid(o)的解决办法:1、检查语法错误;2、确保正确的执行环境;3、检查其他代码的冲突;4、使用事件委托;5、使用其他绑定方式;6、检查外部资源等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

183

2023.11.23

java中void的含义
java中void的含义

本专题整合了Java中void的相关内容,阅读专题下面的文章了解更多详细内容。

125

2025.11.27

apache是什么意思
apache是什么意思

Apache是Apache HTTP Server的简称,是一个开源的Web服务器软件。是目前全球使用最广泛的Web服务器软件之一,由Apache软件基金会开发和维护,Apache具有稳定、安全和高性能的特点,得益于其成熟的开发和广泛的应用实践,被广泛用于托管网站、搭建Web应用程序、构建Web服务和代理等场景。本专题为大家提供了Apache相关的各种文章、以及下载和课程,希望对各位有所帮助。

418

2023.08.23

apache启动失败
apache启动失败

Apache启动失败可能有多种原因。需要检查日志文件、检查配置文件等等。想了解更多apache启动的相关内容,可以阅读本专题下面的文章。

937

2024.01.16

Java 流式处理与 Apache Kafka 实战
Java 流式处理与 Apache Kafka 实战

本专题专注讲解 Java 在流式数据处理与消息队列系统中的应用,系统讲解 Apache Kafka 的基础概念、生产者与消费者模型、Kafka Streams 与 KSQL 流式处理框架、实时数据分析与监控,结合实际业务场景,帮助开发者构建 高吞吐量、低延迟的实时数据流管道,实现高效的数据流转与处理。

117

2026.02.04

batoto漫画官网入口与网页版访问指南
batoto漫画官网入口与网页版访问指南

本专题系统整理batoto漫画官方网站最新可用入口,涵盖最新官网地址、网页版登录页面及防走失访问方式说明,帮助用户快速找到batoto漫画官方平台,稳定在线阅读各类漫画内容。

62

2026.02.25

Steam官网正版入口与注册登录指南_新手快速进入游戏平台方法
Steam官网正版入口与注册登录指南_新手快速进入游戏平台方法

本专题系统整理Steam官网最新可用入口,涵盖网页版登录地址、新用户注册流程、账号登录方法及官方游戏商店访问说明,帮助新手玩家快速进入Steam平台,完成注册登录并管理个人游戏库。

6

2026.02.25

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 3.9万人学习

C# 教程
C# 教程

共94课时 | 10.2万人学习

Java 教程
Java 教程

共578课时 | 72.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号