Java中序列化和反序列化的完整讲解

yizhihongxing

Java中序列化和反序列化的完整讲解

序列化和反序列化的概念

序列化(Serialization)是将一个对象变成字节流的过程,可以将对象的状态信息保存在磁盘上或者通过网络传输到另一个远程对象上。

反序列化(Deserialization)是将字节流还原为对象的过程,可以从磁盘或者网络中读取字节流,并将其还原为Java对象。

Java中提供了ObjectOutputStream和ObjectInputStream两个类来支持对象的序列化和反序列化。

序列化的过程

Java对象序列化的过程是将Java对象的状态信息写入到流中。序列化对象需要满足以下要求:

  1. 该对象的类必须实现Serializable接口。Serializable是一个标记接口。

  2. 静态变量不能被序列化。

以下是一个简单的Java对象的定义:

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

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

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }
}

如何将这个对象序列化呢?只需要按照以下步骤:

public static void main(String[] args) {
    Person person = new Person("Jack", 20);
    try (ObjectOutputStream oos = new ObjectOutputStream(
            new FileOutputStream(new File("person.dat")))) {
        oos.writeObject(person);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

上面的代码创建了一个Person对象,并将其写入到名为person.dat的文件中。

反序列化的过程

Java对象反序列化的过程是将流中的对象信息读取出来,并生成一个Java对象。反序列化对象需要满足以下要求:

  1. 必须存在一个类,该类实现了Serializable接口。

以下是进行反序列化的代码:

public static void main(String[] args) {
    try (ObjectInputStream ois = new ObjectInputStream(
            new FileInputStream(new File("person.dat")))) {
        Person person = (Person) ois.readObject();
        System.out.println(person.getName());
        System.out.println(person.getAge());
    } catch (IOException | ClassNotFoundException e) {
        e.printStackTrace();
    }
}

上面的代码将person.dat文件中的数据读取出来,并将其转化为一个Person对象。

自定义序列化

当Java对象的序列化和反序列化需要特殊处理时,可以实现Serializable接口中的writeObject和readObject方法来进行自定义的序列化和反序列化操作。

以下是一个自定义的Java对象:

public class Book implements Serializable {
    private int id;
    private String title;

    Book(int id, String title) {
        this.id = id;
        this.title = title;
    }

    private void writeObject(ObjectOutputStream out) throws IOException {
        out.writeInt(id);
        out.writeUTF(title.toUpperCase());
    }

    private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
        id = in.readInt();
        title = in.readUTF().toLowerCase();
    }

    @Override
    public String toString() {
        return "Book{" +
                "id=" + id +
                ", title='" + title + '\'' +
                '}';
    }
}

在上面的例子中,我们为Book对象实现了自定义的序列化和反序列化方法,将title字段转化为大写字母或小写字母,以此为例进行自定义的序列化和反序列化。

以下是一个使用自定义序列化方法的例子:

public static void main(String[] args) {
    Book book1 = new Book(1, "Thinking in Java");
    Book book2 = new Book(2, "Effective Java");
    try (ObjectOutputStream oos = new ObjectOutputStream(
            new FileOutputStream(new File("books.dat")))) {
        oos.writeObject(book1);
        oos.writeObject(book2);
    } catch (IOException e) {
        e.printStackTrace();
    }
    try (ObjectInputStream ois = new ObjectInputStream(
            new FileInputStream(new File("books.dat")))) {
        Book book3 = (Book) ois.readObject();
        Book book4 = (Book) ois.readObject();
        System.out.println(book3);
        System.out.println(book4);
    } catch (IOException | ClassNotFoundException e) {
        e.printStackTrace();
    }
}

上面的代码创建了一个包含两个Book对象的books.dat文件,并使用自定义的反序列化方法将其读取出来。

总结

Java对象序列化和反序列化是Java中非常重要的概念,它允许我们在不同的应用中传递Java对象,或者将Java对象保存在磁盘上。

序列化的过程是将Java对象的状态信息写入到流中,反序列化的过程是将流中的对象信息读取出来,并生成一个Java对象。在自定义序列化和反序列化时,可以实现Serializable接口中的writeObject和readObject方法来进行特殊处理。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java中序列化和反序列化的完整讲解 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • C语言数组详细介绍

    C语言数组详细介绍 什么是数组? 数组是在C语言中用来存储一组相同数据类型元素的数据结构,数组的每个元素都是通过一个唯一的下标访问的。在C语言中,数组是一段连续的内存地址,这些内存地址都包含相同的数据类型,array[0]表示第一个元素,array[1]表示第二个元素,以此类推。 如何定义一个数组? 在C语言中,数组的定义有两个部分:数据类型和数组名。数组元…

    other 2023年6月25日
    00
  • mysql 5.7.10 安装配置方法图文教程

    MySQL 5.7.10 安装配置方法图文教程 MySQL是一款功能强大的关系型数据库管理系统,被广泛应用于Web应用开发中。本文将为您介绍MySQL 5.7.10的安装及配置方法,并提供图文教程指导您完成全过程。 1. 下载及安装 在MySQL官网(https://dev.mysql.com/downloads/mysql/5.7.html#downloa…

    other 2023年6月27日
    00
  • 关于Dev-C++的安装以及基本使用方法图文入门

    这里是关于Dev-C++的安装以及基本使用方法的完整攻略。 Dev-C++ 安装 Dev-C++是一个免费的集成开发环境(IDE),用于编写和调试C/C++代码。在开始使用之前,需要先进行安装。具体步骤如下: 在 Dev-C++官网 下载最新版的 Dev-C++ 安装包。 双击安装包文件 devcpp-x.x.x.xxx_setup.exe 打开安装向导。 …

    other 2023年6月26日
    00
  • pl/sql执行计划查看

    以下是关于“PL/SQL执行计划查看”的完整攻略: 步骤1:开启执行计划跟踪 首先,需要开启执行计划跟踪。可以使用以下命令来开启执行计划跟踪: ALTER SESSION SET STATISTICS_LEVEL=ALL; 在上面的代码中,我们使用了ALTER SESSION语句来设置STATISTICS_LEVEL参数为ALL,以开启执行计划跟踪。 步骤2…

    other 2023年5月7日
    00
  • Linux 下 安装jdk 1.7

    Linux 下 安装JDK 1.7 在 Linux 下安装 JDK 1.7 通常需要经过以下步骤: 1. 下载 JDK 1.7 JDK 1.7 的安装文件可以在 Oracle 官网下载,也可以在其他可信的第三方网站下载,建议选择官方网站进行下载以确保文件的安全性。 2. 解压 JDK 1.7 下载完成后,需要将文件解压至指定文件夹中。解压方式为执行以下命令:…

    其他 2023年3月28日
    00
  • MAC 系统安装java并配置环境变量

    安装 Java 1.从官网下载 JDK 安装包 首先,需要从 Java 官网下载 Mac 版本的 JDK 安装包(JDK 是 Java Development Kit 的缩写,提供了一组工具和 API,用于开发 Java 应用程序)。下载地址为:https://www.oracle.com/java/technologies/downloads/#jdk-m…

    other 2023年6月27日
    00
  • Outliner大纲式笔记软件介绍

    Outliner大纲式笔记软件介绍 简介 Outliner大纲式笔记软件是一款十分实用的笔记应用程序。其主要特点是使用大纲形式组织和管理笔记,便于用户快速的编写和查看笔记内容。同时,Outliner大纲式笔记软件还支持多平台同步,以保证用户可以随时随地的访问自己的笔记内容。 功能特点 1. 大纲编辑 Outliner大纲式笔记软件支持大纲式编辑,用户可以根据…

    其他 2023年3月28日
    00
  • ios8有什么新功能?ios8正式版更新内容

    iOS 8 新功能详解 iOS 8 是苹果公司于 2014 年推出的操作系统版本,带来了许多令人兴奋的新功能和改进。下面是 iOS 8 正式版的更新内容的详细攻略。 1. 消息应用的改进 iOS 8 中的消息应用得到了一些重要的改进,使得与朋友和家人保持联系更加方便和有趣。 语音消息:现在,你可以通过消息应用发送和接收语音消息。只需按住麦克风图标,录制你想要…

    other 2023年7月27日
    00
合作推广
合作推广
分享本页
返回顶部