news 2026/7/14 16:14:56

Java序列化与反序列化极简入门

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java序列化与反序列化极简入门

Java序列化与反序列化极简入门

适合零基础,只讲最常用、最基础的知识,让你快速掌握对象的保存与恢复。


1. 什么是序列化?

序列化是把 Java 对象转换成字节流的过程,这样对象就可以保存到文件、数据库,或者通过网络传输。
反序列化则是把字节流恢复成原来的 Java 对象。

简单说:序列化 = 对象 → 字节流反序列化 = 字节流 → 对象

有什么用?

  • 保存程序运行状态(比如游戏存档)
  • 网络传输对象(如 RPC 调用)
  • 将对象存入缓存或文件

2. 如何让一个对象可以序列化?

只需要让类实现java.io.Serializable接口,这是一个标记接口(里面没有任何方法),表示这个类的对象可以被序列化。

importjava.io.Serializable;publicclassPersonimplementsSerializable{privateStringname;privateintage;publicPerson(Stringname,intage){this.name=name;this.age=age;}// getter/setter 略@OverridepublicStringtoString(){return"Person{name='"+name+"', age="+age+"}";}}

3. 进行序列化和反序列化

使用ObjectOutputStream将对象写入文件(或其他输出流),使用ObjectInputStream从文件中读取对象。

importjava.io.*;publicclassSerializeDemo{publicstaticvoidmain(String[]args){Personp=newPerson("张三",25);// 序列化:对象 → 文件try(ObjectOutputStreamoos=newObjectOutputStream(newFileOutputStream("person.ser"))){oos.writeObject(p);System.out.println("序列化成功");}catch(IOExceptione){e.printStackTrace();}// 反序列化:文件 → 对象try(ObjectInputStreamois=newObjectInputStream(newFileInputStream("person.ser"))){Personp2=(Person)ois.readObject();System.out.println("反序列化得到: "+p2);}catch(IOException|ClassNotFoundExceptione){e.printStackTrace();}}}

运行后,person.ser文件里就保存了对象数据,读取时能恢复成原来的对象。


4. 重要注意事项(新手必看)

4.1 必须实现 Serializable 接口

如果类没有实现Serializable,尝试序列化会抛出NotSerializableException

4.2transient关键字 —— 跳过某些字段

有些字段不想被序列化(比如密码、临时缓存),可以用transient修饰,序列化时会忽略它,反序列化后该字段为默认值(引用类型为null,基本类型为 0 或 false)。

publicclassUserimplementsSerializable{privateStringusername;privatetransientStringpassword;// 不会被序列化// ...}

4.3serialVersionUID—— 版本控制

建议为每个可序列化的类显式声明一个private static final long serialVersionUID。当类发生修改(如增加字段),反序列化时会用这个版本号来判断是否兼容。如果不指定,JVM 会动态生成,类一改动就会导致InvalidClassException

publicclassPersonimplementsSerializable{privatestaticfinallongserialVersionUID=1L;// ...}

4.4 静态字段不会序列化

因为静态字段属于类,不属于对象,序列化只保存对象的状态,所以静态字段的值不会被保存。

4.5 如果字段是引用类型,该对象也必须可序列化

如果类中有一个字段是其他类的对象,那么那个类也必须实现Serializable,否则序列化失败。


5. 完整示例(含 transient 和 serialVersionUID)

importjava.io.*;classStudentimplementsSerializable{privatestaticfinallongserialVersionUID=1L;privateStringname;privateintscore;privatetransientStringpassword;// 不序列化publicStudent(Stringname,intscore,Stringpassword){this.name=name;this.score=score;this.password=password;}@OverridepublicStringtoString(){return"Student{name='"+name+"', score="+score+", password='"+password+"'}";}}publicclassTestSerial{publicstaticvoidmain(String[]args)throwsException{Students=newStudent("李四",95,"123456");// 序列化ObjectOutputStreamoos=newObjectOutputStream(newFileOutputStream("student.ser"));oos.writeObject(s);oos.close();// 反序列化ObjectInputStreamois=newObjectInputStream(newFileInputStream("student.ser"));Students2=(Student)ois.readObject();ois.close();System.out.println("原始对象: "+s);System.out.println("恢复对象: "+s2);// 会发现 password 字段为 null(因为 transient)}}

输出类似:

原始对象: Student{name='李四', score=95, password='123456'} 恢复对象: Student{name='李四', score=95, password='null'}

6. 总结

概念说明
序列化对象 → 字节流,保存或传输
反序列化字节流 → 对象
实现方式类实现Serializable接口
核心类ObjectOutputStream/ObjectInputStream
transient标记字段不参与序列化
serialVersionUID版本控制,建议显式声明
静态字段不会被序列化
引用类型字段该对象的类也必须实现Serializable

掌握了这些,你就可以轻松地将 Java 对象保存到文件或在网络中传递了。实际开发中,还会结合 JSON、XML 等更轻量的方式,但 Java 原生序列化依然是基础。

如果对你有帮助,点个赞吧~

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

Agent Skills使用与设计

教程:05-使用skill做企业网站设计_哔哩哔哩_bilibili 一.什么是skill 二.下载 计算机与数学类职业 Agent Skills(SOC 分类 15-0000)| SkillsMP 三.使用 1.使用方式 我使用Claude code示范 安装教程:Claude code入门-CSDN博客 安装…

作者头像 李华
网站建设 2026/7/12 23:09:09

VerSprite推出Fork和Knife:专为现代软件开发速度打造的AI驱动型威胁建模与对抗性测试平台

该一体化平台由以风险为中心的PASTA方法论和二十年的认证攻击性安全经验提供支持,让企业能够在安全冲刺中进行威胁建模,然后通过AI主导、人机协同的测试来验证风险。 基于风险的威胁建模领域的全球领导者、PASTA(攻击模拟与威胁分析流程&…

作者头像 李华
网站建设 2026/7/13 5:07:23

IDA-逆向分析-工具教程-IDA核心窗口解析与实战应用

1. IDA Pro逆向分析入门指南 第一次打开IDA Pro时,面对密密麻麻的汇编代码和十几个功能窗口,很多新手都会感到无从下手。作为逆向工程师的瑞士军刀,IDA的强大之处在于它能将二进制文件中的机器码转化为人类可读的汇编代码,并通过多…

作者头像 李华
网站建设 2026/7/13 5:38:00

基于Anthropic-Cybersecurity-Skills构建网络安全AI智能体实战指南

最近在尝试构建一个面向企业安全的AI智能体时,发现市面上虽然有不少AI Agent框架,但专门针对网络安全领域的、开箱即用的技能库却非常稀缺。要么需要从零开始编写复杂的提示词和工具链,要么就是通用技能难以满足安全分析、漏洞评估等专业场景…

作者头像 李华
网站建设 2026/7/14 14:09:38

对线程的理解

一、线程是什么进程是操作系统资源分配的最小单位(独立内存、文件句柄、CPU 上下文等),而线程是进程内部独立执行流,是 CPU 调度执行的最小单位。 一个进程至少包含一条主线程,同一进程下所有线程共享进程的堆、全局变…

作者头像 李华