JAVA序列化和反序列化
文章目录
- JAVA序列化和反序列化
- 序列化
- 什么是序列化?
- 为什么要进行序列化?
- 如何将对线进行序列化
- 具体实现过程
- 完整代码
序列化
什么是序列化?
就是将对象转化为字节的过程
为什么要进行序列化?
- 让数据更高效的传输
- 让数据更好的被存储
如何将对线进行序列化
对象要想进行序列化必须满足两个条件:
- 该类必须实现 java.io.Serializable 接口
- 该类的所有属性必须是可序列化的
具体实现过程
通过implements实现序列化接口:
import java.io.Serializable;
public class student implements Serializable {
public String name;
public int course;
public int age;
public void behavior(){
System.out.println("I am student");
}
}
这样就允许该对象类被序列化,重写序列化函数
// 导入java.io.*包,这个包包含了Java IO的所有类和接口,提供了全面的输入/输出接口支持。
import java.io.*;
// 定义一个名为Serialization_And_Unserialization的公共类。这个类将演示如何实现对象的序列化和反序列化。
public class Serialization_And_Unserialization {
// 定义一个公共方法Serialize,它接受一个Object类型的对象和一个File类型的文件名作为参数。这个方法将对象序列化并写入到指定的文件中。
public void Serialize(Object obj,File filename) throws IOException {
// 创建一个FileOutputStream对象,它将创建一个新的文件输出流,允许将字节写入到指定的文件中。
FileOutputStream FO = new FileOutputStream(filename); //新建一个文件输出流 将字节写入文件的输出流
// 创建一个ObjectOutputStream对象,它将创建一个新的对象输出流,用于将对象序列化并写入到之前创建的文件输出流中。
ObjectOutputStream OOS = new ObjectOutputStream(FO);
// 使用ObjectOutputStream的writeObject方法将对象序列化并写入到文件输出流中。
OOS.writeObject(obj);
}
}
使用我们上篇java基础文字写好的对象来进行测试
import java.io.File; // 导入文件类,用于创建文件对象
import java.io.IOException; // 导入IOException类,处理IO操作可能出现的异常
public class Xl { // 定义一个名为Xl的公共类
public static void main(String[] args) throws IOException, ClassNotFoundException { // 主方法,程序入口
student stu2 =new student(); // 创建一个名为stu2的学生对象
Serialization_And_Unserialization s =new Serialization_And_Unserialization(); // 创建一个Serialization_And_Unserialization对象,用于进行对象的序列化和反序列化操作
s.Serialize(stu2, new File("stu2.txt")); // 使用Serialize方法将stu2对象序列化并保存到名为stu2.txt的文件中
}
}
我们可以看到文件已经生成了
接下来再写一个方法将它进行反序列化
public Object Unserialize(String filename) throws IOException, ClassNotFoundException {
// 创建一个FileInputStream对象,它将创建一个新的文件输入流,允许从指定的文件中读取字节。
FileInputStream FI = new FileInputStream(filename);
// 创建一个ObjectInputStream对象,它将创建一个新的对象输入流,用于从之前创建的文件输入流中读取并反序列化对象。
ObjectInputStream OIS = new ObjectInputStream(FI);
// 使用ObjectInputStream的readObject方法从文件输入流中读取并反序列化对象,然后返回这个对象。
return OIS.readObject();
}
我们进行调用
Object stu3=s.Unserialize("stu2.txt"); // 使用Unserialize方法从名为stu2.txt的文件中读取并反序列化对象,然后将其赋给stu3变量
System.out.println(stu3); // 打印stu3对象
看到已经准换回来了
完整代码
重写方法代码
// 导入java.io.*包,这个包包含了Java IO的所有类和接口,提供了全面的输入/输出接口支持。
import java.io.*;
// 定义一个名为Serialization_And_Unserialization的公共类。这个类将演示如何实现对象的序列化和反序列化。
public class Serialization_And_Unserialization {
// 定义一个公共方法Serialize,它接受一个Object类型的对象和一个File类型的文件名作为参数。这个方法将对象序列化并写入到指定的文件中。
public void Serialize(Object obj,File filename) throws IOException {
// 创建一个FileOutputStream对象,它将创建一个新的文件输出流,允许将字节写入到指定的文件中。
FileOutputStream FO = new FileOutputStream(filename);
// 创建一个ObjectOutputStream对象,它将创建一个新的对象输出流,用于将对象序列化并写入到之前创建的文件输出流中。
ObjectOutputStream OOS = new ObjectOutputStream(FO);
// 使用ObjectOutputStream的writeObject方法将对象序列化并写入到文件输出流中。
OOS.writeObject(obj);
}
// 定义一个公共方法Unserialize,它接受一个String类型的文件名作为参数。这个方法将从指定的文件中读取对象并将其反序列化。
public Object Unserialize(String filename) throws IOException, ClassNotFoundException {
// 创建一个FileInputStream对象,它将创建一个新的文件输入流,允许从指定的文件中读取字节。
FileInputStream FI = new FileInputStream(filename);
// 创建一个ObjectInputStream对象,它将创建一个新的对象输入流,用于从之前创建的文件输入流中读取并反序列化对象。
ObjectInputStream OIS = new ObjectInputStream(FI);
// 使用ObjectInputStream的readObject方法从文件输入流中读取并反序列化对象,然后返回这个对象。
return OIS.readObject();
}
}
调用代码
import java.io.File; // 导入文件类,用于创建文件对象
import java.io.IOException; // 导入IOException类,处理IO操作可能出现的异常
public class Xl { // 定义一个名为Xl的公共类
public static void main(String[] args) throws IOException, ClassNotFoundException { // 主方法,程序入口
student stu2 =new student(); // 创建一个名为stu2的学生对象
Serialization_And_Unserialization s =new Serialization_And_Unserialization(); // 创建一个Serialization_And_Unserialization对象,用于进行对象的序列化和反序列化操作
s.Serialize(stu2, new File("stu2.txt")); // 使用Serialize方法将stu2对象序列化并保存到名为stu2.txt的文件中
Object stu3=s.Unserialize("stu2.txt"); // 使用Unserialize方法从名为stu2.txt的文件中读取并反序列化对象,然后将其赋给stu3变量
System.out.println(stu3); // 打印stu3对象
}
}