0

0

如何在Java中实现对象的序列化与反序列化_Serializable接口应用

P粉602998670

P粉602998670

发布时间:2026-02-20 11:38:02

|

891人浏览过

|

来源于php中文网

原创

根本原因是类中存在不可序列化的成员字段,如thread、socket、匿名内部类引用或未实现serializable的第三方类;应使用transient标记非序列化字段、检查所有字段可序列化性、避免lambda捕获this,并自定义writeobject/readobject处理非序列化资源。

如何在java中实现对象的序列化与反序列化_serializable接口应用

为什么加了 Serializable 还抛 NotSerializableException

根本原因不是没加接口,而是类里有不可序列化的成员——比如 ThreadSocket、匿名内部类引用外部非序列化对象,或者用了未实现 Serializable 的第三方类字段。

实操建议:

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

  • transient 显式标记不该被序列化的字段(如缓存、连接句柄)
  • 检查所有非基本类型字段是否都实现了 Serializable;尤其注意 ArrayList 里的元素类型是否可序列化
  • 避免在 Serializable 类中持有 lambda 表达式或匿名类实例,它们会隐式捕获 this 引用
  • 如果必须存非序列化资源,改用 writeObject() / readObject() 自定义序列化逻辑

serialVersionUID 不写会怎样?什么时候必须手动指定

不写时 JVM 会基于类结构自动生成一个 serialVersionUID,但只要类稍作修改(增删字段、改访问修饰符、甚至换 JDK 版本),生成值就可能变化,导致反序列化时抛 InvalidClassException:class incompatible with stream。

实操建议:

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

  • 所有实现 Serializable 的类,第一行就加上 private static final long serialVersionUID = 1L;
  • 版本升级需兼容旧数据时,只增加 transient 字段或提供默认值,serialVersionUID 保持不变
  • 若字段语义变更(如 int age 改为 LocalDateTime birthDate),应更新 serialVersionUID 并重写 readObject() 做迁移
  • IDEA 或 serialver 命令可生成初始值,但别直接用它生成的长数字——可读性差且无意义

ObjectOutputStream 写文件后,为什么别的语言读不了

Java 默认序列化是二进制私有协议,含类名、字段描述、JVM 版本等元信息,其他语言基本无法解析。这不是 bug,是设计使然。

Flux AI
Flux AI

Flux AI,释放你的想象力,用文字生成图像

下载

实操建议:

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

  • 跨语言场景下,彻底放弃 ObjectOutputStream,改用 JSON(jackson)、Protobuf(protobuf-java)或 Avro
  • 即使同是 Java,不同 JDK 小版本间也可能存在兼容性问题(如 JDK 17 序列化对象在 JDK 8 反序列化失败)
  • 若必须用原生序列化,确保两端 JDK 版本一致,并严格管理 serialVersionUID 和字段变更
  • 不要把序列化字节流当通用存储格式——它不是为持久化设计的,只是临时进程间传递的权宜之计

反序列化时怎么防止恶意代码执行

ObjectInputStream 在读取字节流时会自动调用目标类的 readObject(),而攻击者可构造恶意字节流触发任意类的静态初始化块或 readObject() 中的危险逻辑(如 Runtime.exec())。

实操建议:

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

  • 永远不要对不可信来源的字节流调用 ObjectInputStream.readObject()
  • 使用 ObjectInputStream.resolveClass() 重写,白名单限制只允许加载指定类(如 MyData.class
  • 更推荐方案:用 ValidationInputFilter(JDK 9+)或在 ObjectInputStream 构造后立即设置过滤器:ois.setObjectInputFilter(...)
  • Spring 等框架默认禁用反序列化,除非显式配置;生产环境应视 ObjectInputStream 为高危 API

序列化看着简单,但字段生命周期、JVM 版本、安全边界、跨语言需求这些点一碰就容易出问题。最常被忽略的是:它从来就不是个通用数据交换机制,只是 Java 生态内部一个带坑的快捷键。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

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

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

143

2025.08.06

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

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

81

2026.01.26

json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

442

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

544

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

322

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

81

2025.09.10

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

790

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

576

2024.08.29

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

776

2026.02.13

热门下载

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

精品课程

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

共23课时 | 3.7万人学习

C# 教程
C# 教程

共94课时 | 9.8万人学习

Java 教程
Java 教程

共578课时 | 68.4万人学习

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

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