Java 对象的序列化和反序列化是 Java 编程中的一项重要技术。序列化和反序列化可以将 Java 对象在网络传输或存储时转化为二进制数据流,并在需要时将其重新生成为 Java 对象。本文将详细讲解序列化和反序列化的基本概念、实现基础、序列化和反序列化的示例应用等内容,以便读者可以深刻理解和掌握这一技术。
什么是序列化与反序列化?
序列化是指将 Java 对象转化为二进制字节流的过程,可用于将 Java 对象保存到文件系统、数据库或在计算机网络上传输。反序列化是指将二进制数据流重新转换为 Java 对象的过程。序列化和反序列化的主要目的是实现 Java 对象的持久化和网络传输。
序列化和反序列化的实现基础
Java 对象的序列化和反序列化是基于 Serializable 接口实现的。要想实现序列化和反序列化,首先需要让对象所属类实现 Serializable 接口。Serializable 接口是 Java 标准库中的一个接口,只需要让实现此接口的类中定义的所有实例变量都是可序列化的即可。可序列化的变量必须是 Java 原生数据类型和某些特殊对象,如 Date,String 或自定义的可序列化对象等。如果可序列化的变量包含对其他对象的引用,则需要确保这些对象也可以序列化。这意味着同一层级的所有对象必须实现 Serializable 接口。Java 的基本数据类型都可以序列化,包括 int、long、double、char 等等。 Serializable 接口仅仅是个标记接口,不实现里面的方法。
以下是一个简单的序列化和反序列化示例:
import java.io.*;
public class SerializationDemo {
public static void main(String[] args) throws Exception {
String filename = "test.txt"; // 定义一个文件名字
// 序列化操作
FileOutputStream file = new FileOutputStream(filename); // 初始化文件流,写入的文件名为文件名指定的文件
ObjectOutputStream out = new ObjectOutputStream(file); // 获得对象流
out.writeObject(new Date()); // 将日期对象写入文件
out.close(); // 关闭输出流
// 反序列化操作
FileInputStream file2 = new FileInputStream(filename); // 初始化文件流
ObjectInputStream in = new ObjectInputStream(file2); // 获得对象流
Date d = (Date) in.readObject(); // 从文件读取对象,并转型为日期对象
System.out.println(d); // 打印日期对象
in.close(); // 关闭输入流
}
}
在此例子中,首先定义了一个名为 SerializationDemo 的类,在 main 方法中,首先定义一个名为 filename 的文件名,在序列化时,通过 FileOutputStream 创建一个写入指定文件的输出流,然后通过 ObjectOutputStream 创建一个对象输出流,并将该流与文件输出流进行关联,从而将日期对象存储在文件中。在反序列化时,通过 FileInputStream 创建一个输入流,然后通过 ObjectInputStream 创建一个对象输入流,并将其与文件输入流关联,最后将反序列化的对象转换为 Date 类型并将其打印在屏幕上。
序列化与反序列化示例分析
本节将通过两个简单示例演示 Java 对象的序列化和反序列化过程。
示例 1:存储和读取 ArrayList
ArrayList 是一个基本的 Java 集合类,用于存储一组元素。下面是一个实现序列化和反序列化 ArrayList 的示例。
import java.io.*;
import java.util.ArrayList;
public class SerializationDemo {
public static void main(String[] args) throws Exception {
String filename = "test.txt"; // 定义一个文件名字
ArrayList<String> list = new ArrayList<>();
list.add("Hello");
list.add("World");
list.add("!");
// 序列化操作
FileOutputStream file = new FileOutputStream(filename); // 初始化文件流
ObjectOutputStream out = new ObjectOutputStream(file); // 获得对象流
out.writeObject(list); // 将列表写入文件
out.close(); // 关闭输出流
// 反序列化操作
FileInputStream file2 = new FileInputStream(filename); // 初始化文件流
ObjectInputStream in = new ObjectInputStream(file2); // 获得对象流
ArrayList<String> l = (ArrayList<String>) in.readObject(); // 从文件读取对象,并转型为列表
System.out.println(l); // 打印列表
in.close(); // 关闭输入流
}
}
在此例子中,我们首先定义了一个 ArrayList 对象,并将三个字符串加入到列表中。然后,我们创建了一个名为 filename 的文件名,并使用 FileOutputStream 创建一个写入此文件的输出流。接下来,我们使用 ObjectOutputStream 创建了一个对象输出流,并将其与文件输出流关联。然后,我们将列表写入文件中,并关闭了输出流。在反序列化时,我们使用 FileInputStream 创建一个输入流,然后使用 ObjectInputStream 创建了一个对象输入流,并将其与文件输入流关联,最后将反序列化的对象转换为 ArrayList 类型并将其打印在屏幕上。
示例 2:序列化和反序列化自定义对象
接下来,我们将演示如何序列化和反序列化自定义对象。在本例子中,我们将演示如何序列化和反序列化一个名为 Employee 的自定义对象。
import java.io.*;
class Employee implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private int salary;
public Employee(String name, int salary) {
this.name = name;
this.salary = salary;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getSalary() {
return salary;
}
public void setSalary(int salary) {
this.salary = salary;
}
@Override
public String toString() {
return "Employee [name=" + name + ", salary=" + salary + "]";
}
}
public class SerializationDemo {
public static void main(String[] args) throws Exception {
String filename = "test.txt"; // 定义一个文件名字
Employee e = new Employee("Mike", 50000);
// 序列化操作
FileOutputStream file = new FileOutputStream(filename); // 初始化文件流
ObjectOutputStream out = new ObjectOutputStream(file); // 获得对象流
out.writeObject(e); // 将员工对象写入文件
out.close(); // 关闭输出流
// 反序列化操作
FileInputStream file2 = new FileInputStream(filename); // 初始化文件流
ObjectInputStream in = new ObjectInputStream(file2); // 获得对象流
Employee e1 = (Employee) in.readObject(); // 从文件读取对象,并转型为 Employee 对象
System.out.println(e1); // 打印 Employee 对象
in.close(); // 关闭输入流
}
}
在本例子中,我们首先定义了一个名为 Employee 的自定义对象,并让其实现 Serializable 接口。Employee 对象包含两个字段,即员工姓名和工资。接下来,我们创建了一个名为 filename 的文件名,并使用 FileOutputStream 创建一个写入此文件的输出流。然后,我们使用 ObjectOutputStream 创建了一个对象输出流,并将其与文件输出流关联。在写入员工对象之后,我们关闭了输出流。在反序列化时,我们使用 FileInputStream 创建一个输入流,然后使用 ObjectInputStream 创建了一个对象输入流,并将其与文件输入流关联,最后将反序列化的对象转换为 Employee 类型并将其打印在屏幕上。
总结
本文深入讲解了 Java 对象的序列化和反序列化。首先解释了什么是序列化和反序列化的含义和用途,接着阐述了序列化和反序列化的实现基础。然后,通过示例演示了如何序列化和反序列化 ArrayList 和自定义对象。本文的内容对于需要进行 Java 对象持久化或在计算机网络上进行 Java 对象传输的读者特别有用。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:实例分析java对象的序列化和反序列化 - Python技术站