0

0

OOP对象序列化是什么_Java对象持久化机制说明

P粉602998670

P粉602998670

发布时间:2025-12-29 21:57:08

|

941人浏览过

|

来源于php中文网

原创

对象序列化是将Java对象状态转为字节流以实现跨时间/空间持久化或传输,反序列化则还原对象;需实现Serializable接口,注意transient、static字段不参与、父类构造要求及serialVersionUID版本控制。

oop对象序列化是什么_java对象持久化机制说明

OOP对象序列化,就是把内存中一个活的Java对象“拍个照”,变成一串可存储、可传输的字节流;反序列化则是用这张“照片”重新还原出原来那个对象。它不是保存代码,而是保存对象**此刻的状态**——包括字段值、引用关系,甚至嵌套对象的完整结构。

为什么Java需要对象序列化

Java对象天生只存在于JVM内存里,程序一关就没了。但现实场景常要求对象“跨时间”或“跨空间”存在:

  • 把用户登录态存到文件或Redis里,下次启动还能认出是谁
  • 微服务之间传订单对象,不能只传ID,得把整个Order实例送过去
  • RMI远程调用时,参数和返回值必须能打包发走
  • 做深拷贝——new一个新对象并递归复制所有引用对象,一行writeObject就能搞定

怎么让一个类支持序列化

只需让类实现red">Serializable接口,它是个空标记接口,不强制你写任何方法。JVM看到这个标记,就知道:“哦,这个类允许被序列化”。

但有三点必须注意:

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

  • 所有非static、非transient字段都会被默认序列化;static属于类,transient表示“别管我”,这两类字段反序列化后是默认值(0、null、false)
  • 父类没实现Serializable?那父类字段不会被保存,反序列化时靠父类无参构造器初始化(所以父类最好有无参构造)
  • 如果类后续会修改(比如加字段、改类型),强烈建议显式声明private static final long serialVersionUID = 1L;,否则版本不匹配直接抛InvalidClassException

基本操作:两行代码完成持久化

序列化到文件:

```java
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("user.ser"))) {
  oos.writeObject(new User("李四", 30));
}

AIBox 一站式AI创作平台
AIBox 一站式AI创作平台

AIBox365一站式AI创作平台,支持ChatGPT、GPT4、Claue3、Gemini、Midjourney等国内外大模型

下载

反序列化读回来:

```java
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("user.ser"))) {
  User u = (User) ois.readObject(); // 类型需一致
}

注意:readObject()返回Object,必须手动强转;且该类在反序列化时必须在classpath中存在,否则报ClassNotFoundException。

它和数据库存对象有什么区别

数据库存的是结构化数据(字段→列),本质是把对象“拆开存”;序列化是把整个对象图原样封成字节流,“打包存”。前者便于查询和关联,后者强调状态保真与快速重建。比如缓存一个计算结果复杂的报表对象,序列化存Redis比查库再组装快得多。

基本上就这些。不复杂但容易忽略细节,尤其是serialVersionUID和transient的配合使用。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

254

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1089

2024.03.01

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

254

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1089

2024.03.01

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1958

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

658

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2401

2025.12.29

java接口相关教程
java接口相关教程

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

47

2026.01.19

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

26

2026.03.13

热门下载

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

精品课程

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

共23课时 | 4.4万人学习

C# 教程
C# 教程

共94课时 | 11.3万人学习

Java 教程
Java 教程

共578课时 | 82万人学习

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

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