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 @ 2022-09-26 23:13  靠谱杨  阅读(417)  评论(0编辑  收藏  举报