Java对象序列化和反序列化
Java类的序列化和反序列化
序列化:指将对象转换为字节序列的过程,也就是将对象的信息转换成文件保存。
反序列化:将字节序列转换成目标对象的过程,也就是读取文件,并转换为对象。
几个关键点:
- 必须实现Serializable接口才可以进行序列化
- 字段属性 serialVersionUID 决定了被修改后的类(比如增加或删除了一个字段),序列化和反序列化是否成功【相当于验证版本一致性的编号】
这个字段可以自定义,也可以用IDE生成,还可以调用方法生成
自定义比如: private static final long serialVersionUID = 1L;
使用编译器生成需要设置一下:
使用代码生成可以这样写:
ObjectStreamClass c = ObjectStreamClass.lookup(Student.class); long serialID = c.getSerialVersionUID(); System.out.println(serialID);
建议自己指定一个ID,因为如果是自动生成的话,可能会存在版本不同的问题。
!!!记住这个字段的类型是static final long !!!
下面上代码:
待序列化的类Student
package serializable; /** * @author Administrator * @date 2022-09-26 21:47 */ // 实现Serializable接口的学生类 import java.io.Serializable; public class Student implements Serializable { private static final long serialVersionUID = -575577087488357438L; private int age; private String name; public Student(int age, String name) { this.age = age; this.name = name; } @Override public String toString() { return "Student{" + "age=" + age + ", name='" + name + '\'' + '}'; } }
序列化和反序列化测试类STest
package serializable; import java.io.*; /** * @author Administrator * @date 2022-09-26 21:48 */ public class STest { public static void main(String[] args) { serial(); deserial(); } // 序列化方法 private static void serial(){ Student student = new Student(21, "John"); try { // FileOutputStream流是指文件字节输出流, // 专用于输出原始字节流如图像数据等,其继承OutputStream类,拥有输出流的基本特性 FileOutputStream fileOutputStream = new FileOutputStream("Student.txt"); // 对象的序列化流,作用:把对象转成字节数据的输出到文件中保存, // 对象的输出过程称为序列化,可实现对象的持久存储。 ObjectOutputStream objectOutputStream= new ObjectOutputStream(fileOutputStream); objectOutputStream.writeObject(student); objectOutputStream.flush(); } catch (Exception exception) { exception.printStackTrace(); } } // 反序列化方法 private static void deserial() { try { FileInputStream fis = new FileInputStream("Student.txt"); // ObjectInputStream 反序列化流, // 将之前使用 ObjectOutputStream 序列化的原始数据恢复为对象,以流的方式读取对象。 // 构造方法 ObjectInputStream(InputStream in) 创建从指定 InputStream 读取的 ObjectInputStream。 ObjectInputStream ois = new ObjectInputStream(fis); Student student = (Student) ois.readObject(); ois.close(); System.out.println(student.toString()); }catch (IOException | ClassNotFoundException e) { e.printStackTrace(); } } }
直接运行STest的main方法,可以看到生成了Student.txt字节流序列化文件,再次调用反序列化方法deserial可以看到控制台成功输出了Student对象的信息。【因为重写了toString方法,所以输出的是字段属性值】
好看请赞,养成习惯:) 本文来自博客园,作者:靠谱杨, 转载请注明原文链接:https://www.cnblogs.com/rainbow-1/p/16732944.html
欢迎来我的51CTO博客主页踩一踩 我的51CTO博客
文章中的公众号名称可能有误,请统一搜索:靠谱杨的秘密基地
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具