Java对象序列化和反序列化

Java类的序列化和反序列化

序列化:指将对象转换为字节序列的过程,也就是将对象的信息转换成文件保存。

反序列化:将字节序列转换成目标对象的过程,也就是读取文件,并转换为对象。

几个关键点:

  • 必须实现Serializable接口才可以进行序列化
  • 字段属性 serialVersionUID 决定了被修改后的类(比如增加或删除了一个字段),序列化和反序列化是否成功【相当于验证版本一致性的编号】

这个字段可以自定义,也可以用IDE生成,还可以调用方法生成

自定义比如: private static final long serialVersionUID = 1L;

使用编译器生成需要设置一下:

image-20220926223215070

image-20220926223407020

image-20220926223423811

使用代码生成可以这样写:

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方法,所以输出的是字段属性值】

image-20220926224121345

image-20220926224203491

posted @   靠谱杨  阅读(433)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具

喜欢请打赏

扫描二维码打赏

了解更多

点击右上角即可分享
微信分享提示