Java 入门指南:Java IO流 —— 序列化与反序列化

序列化

序列化是指将对象转换为字节流的过程,以便能够将其存储到文件、内存、网络传输等介质中,或者在不同的进程、网络或机器之间进行数据交换。

序列化的逆过程称为反序列化,即将字节流转换为对象。过反序列化,可以从存储介质或网络传输中读取数据,并重新构建对象。

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

部分源码

![[Pasted image 20231102190402.png]]

ObjectInputStream

ObjectInputStream 可以读取 ObjectOutputStream 写入的字节流,并将其反序列化为相应的原始的对象(包含 对象的数据对象的类型对象中存储的属性 等信息)。序列化之前是什么样子,反序列化后就是什么样子。

ObjectInputStream 在反序列化的时候会依次调用 readObject() → readObject0() → readOrdinaryObject() → readSerialData() → defaultReadFields()

构造方法

ObjectInputStream(InputStream in):创建一个指定 InputStreamObjectInputStream

其中,ObjectInputStreamreadObject 方法用来读取指定文件中的对象

readObject()

ObjectInputStream 类中的 readObject 方法用于从输入流中读取并反序列化一个对象。这是 Java 序列化机制中的一个重要组成部分,使得对象的状态可以在不同进程之间传输或持久化到文件中。

读取并反序列化对象

下面是一个使用 ObjectInputStreamreadObject 方法来读取并反序列化对象的示例。

import java.io.*;

public class ObjectInputStreamExample {
   

    public static void main(String[] args) {
   
        // 定义对象存储文件路径
        String filePath = "person.dat";

        try (ObjectInputStream ois = new ObjectInputStream(new 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值