关于Java的对象序列化流和反序列化流详细解读

关于Java的对象序列化流和反序列化流详细解读

什么是对象序列化?

在Java中,对象序列化是指将一个对象转换为字节序列的过程,该字节序列可以被存储于磁盘上,或者将其传递到另一个网络节点中。对象序列化主要用于数据持久化或者网络传输。

如何进行对象序列化?

Java提供了ObjectOutputStream类,它可以将Java对象转换为字节流。下面是一个对象序列化的示例:

try {
    // 创建FileOutputStream对象
    FileOutputStream fos = new FileOutputStream("person.dat");
    // 创建ObjectOutputStream对象
    ObjectOutputStream oos = new ObjectOutputStream(fos);
    // 创建Person对象
    Person person = new Person("Tom", 20);
    // 使用oos将person对象序列化
    oos.writeObject(person);
    // 关闭oos
    oos.close();
} catch (IOException e) {
    e.printStackTrace();
}

在上面的示例中,我们首先创建了一个FileOutputStream对象,用于将字节序列输出到文件中。接着,我们创建了一个ObjectOutputStream对象。然后,我们创建了一个Person对象,并使用oos将该对象序列化为字节流并写入文件中。最后,我们使用close()方法关闭了oos。

什么是对象反序列化?

在Java中,对象反序列化是指将字节序列转化为Java对象的过程。对象反序列化主要用于读取持久化的数据或者接收网络传输的字节序列。

如何进行反序列化?

Java提供了ObjectInputStream类,它可以将字节流转换为Java对象。下面是一个反序列化示例:

try {
    // 创建FileInputStream对象
    FileInputStream fis = new FileInputStream("person.dat");
    // 创建ObjectInputStream对象
    ObjectInputStream ois = new ObjectInputStream(fis);
    // 从文件中读取字节流并反序列化为Person对象
    Person person = (Person) ois.readObject();
    // 输出person对象
    System.out.println(person);
    // 关闭ois
    ois.close();
} catch (IOException | ClassNotFoundException e) {
    e.printStackTrace();
}

在上面的示例中,我们首先创建了一个FileInputStream对象,用于读取指定文件中的字节流。接着,我们创建了一个ObjectInputStream对象。然后,我们使用ois从文件中读取字节流,并反序列化为Person对象。最后,我们输出person对象,并使用close()方法关闭了ois。

对象序列化和反序列化的注意事项

1. 只有实现了Serializable接口的对象才能进行序列化和反序列化

当我们执行序列化和反序列化操作时,只有实现了Serializable接口的类的对象才能进行这些操作。如果我们尝试对一个未实现Serializable接口的类的对象进行序列化操作,将会抛出NotSerializableException异常。

2. 序列化/反序列化过程中可能会出现异常

在序列化/反序列化过程中可能会出现各种异常,例如IOException, ClassNotFoundException等。因此,在进行序列化/反序列化操作时,我们应该适时地捕获并处理异常。

示例说明

示例1:对象序列化

在下面的示例中,我们创建了一个Person类,并将其序列化为字节流,并将其写入到person.dat文件中。

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.Serializable;

public class Person implements Serializable {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    public static void main(String[] args) {
        try {
            // 创建FileOutputStream对象
            FileOutputStream fos = new FileOutputStream("person.dat");
            // 创建ObjectOutputStream对象
            ObjectOutputStream oos = new ObjectOutputStream(fos);
            // 创建Person对象
            Person person = new Person("Tom", 20);
            // 使用oos将person对象序列化
            oos.writeObject(person);
            // 关闭oos
            oos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

示例2:对象反序列化

在下面的示例中,我们从person.dat文件中读取字节流,并将其反序列化为Person对象,并将该对象输出到控制台中。

import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.Serializable;

public class Person implements Serializable {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    public static void main(String[] args) {
        try {
            // 创建FileInputStream对象
            FileInputStream fis = new FileInputStream("person.dat");
            // 创建ObjectInputStream对象
            ObjectInputStream ois = new ObjectInputStream(fis);
            // 从文件中读取字节流并反序列化为Person对象
            Person person = (Person) ois.readObject();
            // 输出person对象
            System.out.println(person);
            // 关闭ois
            ois.close();
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

以上就是关于Java的对象序列化流和反序列化流的详细解读。在实际使用中,我们需要根据具体的需求,合理地进行对象序列化和反序列化操作,以便更好地实现数据的持久化和网络传输。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:关于Java的对象序列化流和反序列化流详细解读 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • spring jpa 审计功能自定义填充字段方式

    首先,我们需要了解什么是 Spring Data JPA 审计功能。Spring Data JPA 审计功能是从 Spring Data JPA 1.5 版本开始引入的一个功能,它提供了一种简单方便的方式来自动填充实体类中的创建时间、修改时间、创建人、修改人等审计信息。在默认情况下,Spring Data JPA 审计功能会自动填充这些审计信息字段,但是有时…

    Java 2023年5月20日
    00
  • springboot实战权限管理功能图文步骤附含源码

    下面我就为您讲解一下“springboot实战权限管理功能图文步骤附含源码”的完整攻略。 一、搭建Spring Boot环境 首先,我们需要搭建好Spring Boot的运行环境,并创建一个新的Spring Boot项目。下面是新建一个Spring Boot项目的步骤: 打开IntelliJ IDEA软件,选择File -> New -> Pro…

    Java 2023年5月20日
    00
  • 基于Java代码实现判断春节、端午节、中秋节等法定节假日的方法

    下面我将详细讲解“基于Java代码实现判断春节、端午节、中秋节等法定节假日的方法”的完整攻略。 1. 获取法定节假日列表 首先,我们需要获取法定节假日的列表。这个列表可以通过国家法定节假日的规定来获得,例如中国的法定节假日列表可以通过国务院发布的公告来获取。 我们取到的列表格式可能是类似以下的内容: { "春节": [ "202…

    Java 2023年5月20日
    00
  • Spring Security常用过滤器实例解析

    接下来我将为您详细讲解 Spring Security 常用过滤器实例解析的完整攻略。 1. Spring Security 常用过滤器简介 Spring Security 是一种强大且高度可定制的认证和授权框架,它为 Web 应用程序提供了安全性。Spring Security 通过使用一系列过滤器来保护应用程序,并控制对资源的认证和授权访问。Spring…

    Java 2023年5月20日
    00
  • Java创建和启动线程的两种方式实例分析

    Java创建和启动线程的两种方式实例分析 在 Java 中,线程是并发编程的核心概念之一。线程的创建和启动是任何并发应用的首要任务之一。Java 提供了两种方式来创建和启动线程,分别是继承 Thread 类和实现 Runnable 接口。 继承 Thread 类 继承 Thread 类是最常用的创建线程的方式,实现比较简单。我们需要继承 Thread 类,重…

    Java 2023年5月19日
    00
  • Java Apache Commons报错“ParseException”的原因与解决方法

    “ObjectNotFoundException”是Java的Apache Commons类库中的一个异常,通常由以下原因之一引起: 对象不存在:如果对象不存在,则可能会出现此错误。在这种情况下,需要检查对象以解决此问题。 无效的配置:如果配置无效,则可能会出现此错误。在这种情况下,需要检查配置以解决此问题。 以下是两个实例: 例1 如果对象不存在,则可以尝…

    Java 2023年5月5日
    00
  • maven中心仓库OSSRH使用简介(推荐)

    Maven中心仓库OSSRH使用简介(推荐) 如果你是一位Maven项目的开发者,那么你一定会遇到需要将你的项目打包上传到Maven中央仓库的情况。Maven中央仓库是Maven项目的官方仓库,大多数的第三方依赖库都可以在Maven中央仓库上找到。然而,如果你是一个独立的开发者或者组织,你不一定能够将你的项目上传到Maven中央仓库,那么你需要寻找其他的Ma…

    Java 2023年5月19日
    00
  • java nio基础使用示例

    下面是“Java NIO基础使用示例”的完整攻略。 什么是Java NIO Java NIO(New IO)是Java SE 1.4中引入的一个新IO API,它支持高速度的I/O,非阻塞式I/O、可扩展的I/O操作和更好的内存管理等特性。相对于传统的Java I/O API,Java NIO更为灵活、高效,因此在高负载的网络应用中得到了广泛的应用。 Jav…

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部