Java 对象序列化怎么通过自定义 writeObject 实现安全过滤

雨瑶小哥_1106

雨瑶小哥_1106

2026-10-21

155人浏览

原创

writeobject 是 java 序列化中实现安全过滤最直接可控的机制,通过重写 private void writeobject(objectoutputstream) 可精细控制字段写入、敏感数据脱敏、跳过不可序列化资源,并需严格遵循签名约束。

java 对象序列化怎么通过自定义 writeobject 实现安全过滤

Java 对象序列化中,writeObject 是实现安全过滤最直接、最可控的机制之一——它不依赖外部库,也不改变类签名,而是由 JVM 在序列化时自动识别并调用,专用于精细控制哪些字段写入、如何处理敏感数据、是否跳过不可序列化资源。

为什么 writeObject 能做到安全过滤

默认序列化会无差别地保存所有非 transient、非静态字段,包括密码、连接句柄、缓存对象等高危内容。而重写 private void writeObject(ObjectOutputStream) 后,你可以:

  • 完全绕过默认逻辑,只输出你认可的数据
  • 对敏感字段做脱敏(如只存哈希值、空字符串或占位符)
  • 跳过不可序列化字段(如 Thread、Socket),避免 NotSerializableException
  • 插入校验逻辑,比如拒绝序列化未初始化或状态异常的对象

正确写法的关键约束

这个方法不是普通工具函数,JVM 只认特定签名,稍有偏差就失效,导致“看似正常,实则漏控”:

Kibana Saved Objects
Kibana Saved Objects

通过 REST API 管理 Kibana 保存的对象(仪表板、Lens 可视化等)。适用于:① 以编程方式创建、更新、删除仪表板和 Lens 可视化。

下载
  • 必须是 private,不能是 public 或 protected
  • 参数类型必须严格为 ObjectOutputStream,不能是父类或自定义子类
  • 返回类型必须是 void,不能加 static、final 或泛型修饰
  • 异常声明可省略(因为 ObjectOutputStream.writeXXX() 已声明 IOException),但不能擅自改成 throws Exception

典型安全过滤写法示例

假设一个用户类含明文密码和临时缓存,需过滤密码、忽略缓存、保留其余字段:

private void writeObject(ObjectOutputStream out) throws IOException {
    // 1. 先写入所有常规字段(自动跳过 transient)
    out.defaultWriteObject();
    
    // 2. 手动处理敏感字段:只写密码哈希,不写原文
    out.writeUTF(Objects.nonNull(password) ? DigestUtils.md5Hex(password) : "");
    
    // 3. 完全跳过不可序列化的 cache 字段(它被声明为 transient,defaultWriteObject 已忽略)
    // 若未声明 transient,此处可跳过:不调用任何 write 方法即可
}

对应地,readObject 必须按相同顺序读取,并重建状态:

private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
    in.defaultReadObject();
    String hashed = in.readUTF();
    // 密码字段设为 null 或留空,不还原明文
    this.password = null;
}

比 transient 更灵活的过滤场景

transient 是粗粒度开关,而 writeObject 支持细粒度策略:

  • 字段值动态脱敏:比如日志字段只在 debug 模式下序列化
  • 兼容性兜底:老版本字段已删除,但反序列化仍需读取并丢弃,避免 InvalidClassException
  • 写入元数据:追加时间戳、序列化来源标识、校验码,便于审计与验证
  • 条件写入:检查对象状态(如 isValid() 返回 false 时提前抛 IOException 中断序列化)

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

10877

6

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

8002

9

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

2023.07.31

6952

8

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.01

1164

3

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.02

948

3

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

1416

5

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

2869

5

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

2023.08.03

20151

3

配置java环境变量
配置java环境变量

配置Java环境变量是为了让操作系统能够识别和使用Java的相关命令和功能。本专题为大家提供配置java环境变量相关文章,帮助大家解决问题。

2023.08.03

1255

8

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习