news 2026/3/26 15:11:41

Java序列化和反序列化(详解)零基础入门到精通,收藏这篇就够了

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java序列化和反序列化(详解)零基础入门到精通,收藏这篇就够了

一、理解Java序列化和反序列化

**Serialization(序列化):**将java对象以一连串的字节保存在磁盘文件中的过程,也可以说是保存java对象状态的过程。序列化可以将数据永久保存在磁盘上(通常保存在文件中)。

deserialization(反序列化)**:**将保存在磁盘文件中的java字节码重新转换成java对象称为反序列化。

二、序列化和反序列化的应用

两个进程在远程通信时,可以发送多种数据,包括文本、图片、音频、视频等,这些数据都是以二进制序列的形式在网络上传输。

java是面向对象的开发方式,一切都是java对象,想要在网络中传输java对象,可以使用序列化和反序列化去实现,发送发需要将java对象转换为字节序列,然后在网络上传送,接收方收到字符序列后,会通过反序列化将字节序列恢复成java对象。

java序列化的优点:
  • 实现了数据的持久化,通过序列化可以把数据持久地保存在硬盘上(磁盘文件)。
  • 利用序列化实现远程通信,在网络上传输字节序列。

三、序列化和反序列化地实现

1.JDK类库提供的序列化API:

  • java.io.ObjectOutputStream
    表示对象输出流,其中writeObject(Object obj)方法可以将给定参数的obj对象进行序列化,将转换的一连串的字节序列写到指定的目标输出流中。
  • java.io.ObjectInputStream
    该类表示对象输入流,该类下的readObject(Object obj)方法会从源输入流中读取字节序列,并将它反序列化为一个java对象并返回。

序列化要求:

实现序列化的类对象必须实现了Serializable类或Externalizable类才能被序列化,否则会抛出异常。

实现java序列化和反序列化的三种方法:

现在要对student类进行序列化和反序列化,遵循以下方法:

方法一:若student类实现了serializable接口,则可以通过objectOutputstream和objectinputstream默认的序列化和反序列化方式,对非transient的实例变量进行序列化和反序列化。

方法二:若student类实现了serializable接口,并且定义了writeObject(objectOutputStream out)和

readObject(objectinputStream in)方法,则可以直接调用student类的两种方法进行序列化和反序列化。

方法三:若student类实现了Externalizable接口,则必须实现readExternal(Objectinput in)和writeExternal(Objectoutput out)方法进行序列化和反序列化。

JDK类库中的序列化步骤:

第一步:创建一个输出流对象,它可以包装一个输出流对象,如:文件输出流。

ObjectOutputStream out = new ObjectOutputStream(new fileOutputStream(“E:\\JavaXuLiehua\\Student\\Student1.txt”));

第二步:通过输出流对象的writeObject()方法写对象

out.writeObject(“hollo word”);

out.writeObject(“happy”)

JDK中反序列化操作:

第一步:创建文件输入流对象

ObjectInputStream in = new ObjectInputStream(new fileInputStream(“E:\\JavaXuLiehua\\Student\\Student1.txt”));

第二步:调用readObject()方法

String obj1 = (String)in.readObject();

String obj2 = (String)in.readObject();

为了保证正确读取数据,对象输出流写入对象的顺序与对象输入流读取对象的顺序一致。

Student类序列化和反序列化演示:

1.先创建一个继承了serializable类的student类

import java.io.Serializable; //导入io包下的序列化类 //创建实现序列化接口的学生类 public class Student implements Serializable { //私有化成员变量 private String name; private char sex; private int year; private double gpa; public Student(){ //无参构造 } public Student(String name,char sex,int year,double gpa){ //参数给属性赋值 this.name = name; this.sex = sex; this.year = year; this.gpa = gpa; } //重写set和get public String getName() { return name; } public void setName(String name) { this.name = name; } public char getSex() { return sex; } public void setSex(char sex) { this.sex = sex; } public int getYear() { return year; } public void setYear(int year) { this.year = year; } public double getGpa() { return gpa; } public void setGpa(double gpa) { this.gpa = gpa; } }

把Student类的对象序列化到txt文件(E:\\JavaXuLiehua\\Student\\Student1.txt)中,并对文件进行反序列化:

import java.io.*; import java.io.Externalizable; /* 把student类对象序列化到文件E:\\JavaXuLiehua\\Student\\Student1.txt */ public class UserStudent { public static void main(String[] args) throws IOException { Student st = new Student("Tom",'M',20,3.6); //实例化student类 //判断Student1.txt是否创建成功 File file = new File("E:\\JavaXuLiehua\\Student\\Student1.txt"); if(file.exists()) { System.out.println("文件存在"); }else{ //否则创建新文件 file.createNewFile(); } try { //Student对象序列化过程 FileOutputStream fos = new FileOutputStream(file); ObjectOutputStream oos = new ObjectOutputStream(fos); //调用 ObjectOutputStream 中的 writeObject() 方法 写对象 oos.writeObject(st); oos.flush(); //flush方法刷新缓冲区,写字符时会用,因为字符会先进入缓冲区,将内存中的数据立刻写出 fos.close(); oos.close(); //Student对象反序列化过程 FileInputStream fis = new FileInputStream(file); //创建对象输入流 ObjectInputStream ois = new ObjectInputStream(fis); //读取对象 Student st1 = (Student) ois.readObject(); //会抛出异常(类找不到异常) System.out.println("name = " + st1.getName()); System.out.println("sex = " + st1.getSex()); System.out.println("year = " + st1.getYear()); System.out.println("gpa = " + st1.getGpa()); ois.close(); fis.close(); }catch (ClassNotFoundException e){ e.printStackTrace(); } } }

查看txt文件,结果如下:

 sr JavaxulieHua.Studentd9Q藿Hf D gpaC sexI yearL namet Ljava/lang/String;xp@ 烫烫掏 M t Tom

可以看出其中的内容是不容易阅读的,只能通过反序列化读取。

四、transient关键字

transient关键字表示有理的,被修饰的数据不能进行序列化

这里不做详细介绍,修改情况如下:

private transient char sex; //被transient关键字修饰,不参与序列化

运行结果如下:

文件存在 name = Tom sex = year = 20 gpa = 3.6

此时可以看见,被transient关键字修饰的变量sex并没有被序列化,返回了空值。

五、Externalizable接口实现序列化与反序列化

Externalizable接口继承Serializable接口,实现Externalizable接口需要实现readExternal()方法和writeExternal()方法,这两个方法是抽象方法,对应的是serializable接口的readObject()方法和writeObject()方法,可以理解为把serializable的两个方法抽象出来。Externalizable没有serializable的限制,static和transient关键字修饰的属性也能进行序列化。

具体代码实现如下:

复制对象student命名为student1,在里面重写writeExternal()方法和readExternal()方法,如下:

@Override //对抽象方法进行重写 public void writeExternal(ObjectOutput out) throws IOException{ out.writeObject(name); out.writeObject(sex); out.writeObject(year); out.writeObject(gpa); } @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { name = (String) in.readObject(); sex = (char) in.readObject(); year = (int) in.readObject(); gpa = (double) in.readObject(); }

相应的测试方法里面调用这两种方法的时候,直接调用writeObject()方法和readObject()方法即可,重写的writeExternal()和readExternal()方法会自动执行。

FileOutputStream fos1 = new FileOutputStream(file1); ObjectOutputStream oos1 = new ObjectOutputStream(fos1); //调用 ObjectOutputStream 中的 writeObject() 方法 写对象 oos1.writeObject(st); //会自动执行重写的writeExternal()方法
FileInputStream fis1 = new FileInputStream(file1); //创建对象输入流 ObjectInputStream ois1 = new ObjectInputStream(fis1); //读取对象 //会自动执行readExternal()方法 Student1 st1 = (Student1) ois1.readObject(); //会抛出异常(类找不到异常)

虽然student1类里的sex属性被static或transient修饰,但依旧被序列化,结果如下:

文件存在 name = Tom sex = M year = 20 gpa = 3.6

Java开发的就业市场正在经历结构性调整,竞争日益激烈

传统纯业务开发岗位(如仅完成增删改查业务的后端工程师)的需求,特别是入门级岗位,正显著萎缩。随着企业技术需求升级,市场对Java人才的要求已从通用技能转向了更深入的领域经验(如云原生、微服务)或前沿的AI集成能力。这也导致岗位竞争加剧,在一、二线城市,求职者不仅面临技术内卷,还需应对学历与项目经验的高门槛。

大模型为核心的AI领域正展现出前所未有的就业热度与人才红利

2025年,AI相关新发岗位数量同比激增543%,单月增幅最高超过11倍,大模型算法工程师位居热门岗位前列。行业顶尖人才的供需严重失衡,议价能力极强,跳槽薪资涨幅可达30%-50%。值得注意的是,市场并非单纯青睐算法研究员,而是急需能将大模型能力落地于复杂业务系统的工程人才。这使得具备企业级架构思维和复杂系统整合经验的Java工程师,在向“Java+大模型”复合人才转型时拥有独特优势,成为企业竞相争夺的对象,其薪资天花板也远高于传统Java岗位。

说真的,这两年看着身边一个个搞Java、C++、前端、数据、架构的开始卷大模型,挺唏嘘的。大家最开始都是写接口、搞Spring Boot、连数据库、配Redis,稳稳当当过日子。

结果GPT、DeepSeek火了之后,整条线上的人都开始有点慌了,大家都在想:“我是不是要学大模型,不然这饭碗还能保多久?”

先给出最直接的答案:一定要把现有的技术和大模型结合起来,而不是抛弃你们现有技术!掌握AI能力的Java工程师比纯Java岗要吃香的多。

即使现在裁员、降薪、团队解散的比比皆是……但后续的趋势一定是AI应用落地!大模型方向才是实现职业升级、提升薪资待遇的绝佳机遇!

如何学习AGI大模型?

作为一名热心肠的互联网老兵,我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

2025最新版CSDN大礼包:《AGI大模型学习资源包》免费分享**

一、2025最新大模型学习路线

一个明确的学习路线可以帮助新人了解从哪里开始,按照什么顺序学习,以及需要掌握哪些知识点。大模型领域涉及的知识点非常广泛,没有明确的学习路线可能会导致新人感到迷茫,不知道应该专注于哪些内容。

我们把学习路线分成L1到L4四个阶段,一步步带你从入门到进阶,从理论到实战。

L1级别:AI大模型时代的华丽登场

L1阶段:我们会去了解大模型的基础知识,以及大模型在各个行业的应用和分析;学习理解大模型的核心原理,关键技术,以及大模型应用场景;通过理论原理结合多个项目实战,从提示工程基础到提示工程进阶,掌握Prompt提示工程。

L2级别:AI大模型RAG应用开发工程

L2阶段是我们的AI大模型RAG应用开发工程,我们会去学习RAG检索增强生成:包括Naive RAG、Advanced-RAG以及RAG性能评估,还有GraphRAG在内的多个RAG热门项目的分析。

L3级别:大模型Agent应用架构进阶实践

L3阶段:大模型Agent应用架构进阶实现,我们会去学习LangChain、 LIamaIndex框架,也会学习到AutoGPT、 MetaGPT等多Agent系统,打造我们自己的Agent智能体;同时还可以学习到包括Coze、Dify在内的可视化工具的使用。

L4级别:大模型微调与私有化部署

L4阶段:大模型的微调和私有化部署,我们会更加深入的探讨Transformer架构,学习大模型的微调技术,利用DeepSpeed、Lamam Factory等工具快速进行模型微调;并通过Ollama、vLLM等推理部署框架,实现模型的快速部署。

整个大模型学习路线L1主要是对大模型的理论基础、生态以及提示词他的一个学习掌握;而L3 L4更多的是通过项目实战来掌握大模型的应用开发,针对以上大模型的学习路线我们也整理了对应的学习视频教程,和配套的学习资料。

二、大模型经典PDF书籍

书籍和学习文档资料是学习大模型过程中必不可少的,我们精选了一系列深入探讨大模型技术的书籍和学习文档,它们由领域内的顶尖专家撰写,内容全面、深入、详尽,为你学习大模型提供坚实的理论基础(书籍含电子版PDF)

三、大模型视频教程

对于很多自学或者没有基础的同学来说,书籍这些纯文字类的学习教材会觉得比较晦涩难以理解,因此,我们提供了丰富的大模型视频教程,以动态、形象的方式展示技术概念,帮助你更快、更轻松地掌握核心知识

四、大模型项目实战

学以致用,当你的理论知识积累到一定程度,就需要通过项目实战,在实际操作中检验和巩固你所学到的知识,同时为你找工作和职业发展打下坚实的基础。

五、大模型面试题

面试不仅是技术的较量,更需要充分的准备。

在你已经掌握了大模型技术之后,就需要开始准备面试,我们将提供精心整理的大模型面试题库,涵盖当前面试中可能遇到的各种技术问题,让你在面试中游刃有余。


因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

2025最新版CSDN大礼包:《AGI大模型学习资源包》免费分享

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/25 14:39:40

收藏级干货:智能体与大模型:5大维度详解AI技术的核心差异与落地路径

本文深入解析了智能体与大模型的五大核心区别:目标导向(被动响应vs主动闭环)、组成形态(单一组件vs系统集成)、能力边界(模态处理vs任务解决)、交互方式(单次问答vs持续协作)和价值逻辑(能力输出vs效率提升)。大模型作为智能体的核心引擎,提供基础能力&a…

作者头像 李华
网站建设 2026/3/25 13:19:37

Qwen3-VL多语言解析实战:云端1小时=本地折腾一周

Qwen3-VL多语言解析实战:云端1小时本地折腾一周 引言:当老板的紧急需求遇上AI黑科技 上周五下午,外贸公司的张总突然召集紧急会议——下周三有重要客户来访,需要展示公司处理多语言合同的能力。IT部门评估后表示:&qu…

作者头像 李华
网站建设 2026/3/26 11:06:50

HY-MT1.5开源模型价值分析:自主可控翻译系统的构建路径

HY-MT1.5开源模型价值分析:自主可控翻译系统的构建路径 随着全球化进程的加速,高质量、低延迟、多语言支持的机器翻译系统成为企业出海、跨语言内容生产与智能硬件落地的核心基础设施。然而,主流商业翻译API在数据隐私、定制化能力与部署灵活…

作者头像 李华
网站建设 2026/3/26 9:46:51

Qwen3-VL多机部署:临时扩展算力,按小时付费不浪费

Qwen3-VL多机部署:临时扩展算力,按小时付费不浪费 引言 想象一下这样的场景:你创业公司的AI产品突然在社交媒体爆火,用户请求量一夜之间翻了10倍。现有的服务器资源已经不堪重负,但你又不想长期租用高价服务器——毕…

作者头像 李华
网站建设 2026/3/24 7:35:16

聚类分析在网络入侵检测中的应用(源码+万字报告+讲解)(支持资料、图片参考_相关定制)

目录 第一章 绪论 4 1.1课题研究的背景与意义 4 1.1.1什么是web异常检测 4 1.1.2基于机器学习web异常检测技术 4 1.2课题研究的内容 5 本章小结 5 第二章 聚类分析概述 5 2.1 什么是聚类分析 5 2.2 基于距离的聚类 6 2.3 基于密度的聚类 6 2.4本章小结 7 第三章 Web入侵技术概…

作者头像 李华