当前位置: 首页 > news >正文

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 原生序列化依然是基础。

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

http://www.cnnetsun.cn/news/3055606.html

相关文章:

  • Agent Skills使用与设计
  • VerSprite推出Fork和Knife:专为现代软件开发速度打造的AI驱动型威胁建模与对抗性测试平台
  • IDA-逆向分析-工具教程-IDA核心窗口解析与实战应用
  • 【芯片前端】Filelist -f与-F的路径解析陷阱:从Makefile到嵌套场景的深度剖析
  • 基于Anthropic-Cybersecurity-Skills构建网络安全AI智能体实战指南
  • 对线程的理解
  • 关于搜索算法在人工智能中的应用与演化的技术7
  • 华为MetaERP 财务 ERP 解决方案架构师(EBS+SAP+MetaERP 复合背景)全国需求现状 + 城市潜力分级一、全国整体市场需求(2026 年现状)1. 需求整体判断:结构性紧缺,复
  • 数据中心电力模块的发展趋势对数据中心建设有哪些影响?
  • 在Python中用any-singleton实现单例模式单例模式
  • 2025轻松指南:零基础医疗会议转待办,包教包会避坑干货满满
  • 论范式转移中的组织认知坍塌与动态评价体系的重构:从“柯达死链”到“用现在质疑过去”的演进逻辑
  • 安心存取,轻松分享!一款基于 CloudFlare 的开源文件托管工具!
  • Agent 上下文管理深度解析
  • Madgicx 好用吗?当预算跨了三个平台,你需要的可能不是另一个优化器
  • LLM、Token、RAG、MCP……这10个AI名词,一张图给你讲明白
  • TPIC7710评估板实战指南:从硬件连接到电机控制与故障诊断
  • 从零到一:用nssm将任意应用封装为Windows服务
  • 实战!LangGraph Multi-Agent Supervisor 模式:手把手构建生产级多智能体系统
  • 用Rust给Python写一个高性能扩展模块(PyO3实战)
  • XCP协议:从总线标定到汽车ECU数据交互的核心
  • HarmonyOS APP《画伴梦工厂》开发第9篇:相机开发实战——调用系统相机拍照
  • 税务申报工具:税法规则与自动计算的系统
  • HarmonyOS APP《画伴梦工厂》开发第10篇:相册选择与 PhotoViewPicker——从相册导入图片
  • Java的java.lang.foreign.MemorySegment内存访问模式与缓存友好性优化
  • AI之长效智能体Hermes Agent
  • 实时更新策略
  • BufferedInputStream 源码——带有缓冲区的装饰器类 BufferedInputStream.class 的UML关系图,如下所示:
  • 现存coding plan /token plan推荐
  • LockSupport简介