序列化
序列化是指将对象转换为字节流的过程,以便能够将其存储到文件、内存、网络传输等介质中,或者在不同的进程、网络或机器之间进行数据交换。
序列化的逆过程称为反序列化,即将字节流转换为对象。过反序列化,可以从存储介质或网络传输中读取数据,并重新构建对象。
Java中的序列化通过实现 Serializable
接口来实现。Serializable
接口是一个标记接口,没有方法需要实现。当一个类实现了 Serializable 接口时,表示该类的实例对象可以被序列化,如果一个字段不需要序列化,则需要使用 transient
进行修饰。
ObjectOutputStream
java.io.ObjectOutputStream
继承自 OutputStream
类,它可以将Java对象序列化成字节流,以便在文件、网络传输等场景中进行存储、传输或持久化操作。
构造方法:ObjectOutputStream(OutputStream out)
该构造方法接收一个 OutputStream
对象作为参数,用于将序列化后的字节序列输出到指定的输出流中。
ObjectOutputStream
序列化的时候会依次调用 writeObject() → writeObject0() → writeOrdinaryObject() → writeSerialData() → invokeWriteObject() → defaultWriteFields()
。
wirteObject()
writeObject (Object obj)
方法,该方法是 ObjectOutputStream
类中用于将对象序列化成字节序列并输出到输出流中的方法,可以处理对象之间的引用关系、继承关系、静态字段和 transient 字段。
ObjectOutputStream
在序列化的时候,会判断被序列化的对象是哪一种类型,字符串?数组?枚举?还是 Serializable
,如果全都不是的话,抛出 NotSerializableException
。
部分源码
ObjectInputStream
ObjectInputStream
可以读取 ObjectOutputStream
写入的字节流,并将其反序列化为相应的原始的对象(包含 对象的数据
、对象的类型
和 对象中存储的属性
等信息)。序列化之前是什么样子,反序列化后就是什么样子。
ObjectInputStream
在反序列化的时候会依次调用 readObject() → readObject0() → readOrdinaryObject() → readSerialData() → defaultReadFields()
。
构造方法
ObjectInputStream(InputStream in)
:创建一个指定 InputStream
的 ObjectInputStream
。
其中,ObjectInputStream
的 readObject
方法用来读取指定文件中的对象
readObject()
ObjectInputStream
类中的 readObject
方法用于从输入流中读取并反序列化一个对象。这是 Java 序列化机制中的一个重要组成部分,使得对象的状态可以在不同进程之间传输或持久化到文件中。
读取并反序列化对象
下面是一个使用 ObjectInputStream
的 readObject
方法来读取并反序列化对象的示例。
import java.io.*;
public class ObjectInputStreamExample {
public static void main(String[] args) {
// 定义对象存储文件路径
String filePath = "person.dat";
try (ObjectInputStream ois = new ObjectInputStream(new