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

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日

相关文章

  • 如何在android中的textview中换行

    在Android中,可以使用换行符(\n)在TextView中换行。下面是两个示例说明: 示例一:在XML布局文件中使用换行符 <TextView android:id="@+id/my_text_view" android:layout_width="wrap_content" android:layout_h…

    other 2023年5月8日
    00
  • linux中memset的正确用法

    以下是关于Linux中memset函数的正确用法的详细攻略: memset函数简介 memset函数是C语言中的一个函数,用于将一段存空间设置为指定的值。在Linux,memset函数通常用于初始化内存间或清除内存空间。 memset函数的原型如下: void *(void *s, int c, size_t n); 其中,s 是指向要设置的内存空间的指针,…

    other 2023年5月7日
    00
  • evtx是什么文件格式?查看后缀名为.evtx的文件的技巧

    evtx是什么文件格式? evtx是Windows操作系统中用于存储事件日志的文件格式。它是Event Log File的缩写,用于记录操作系统和应用程序生成的事件信息。这些事件可以包括系统错误、警告、应用程序启动和关闭等。 查看后缀名为.evtx的文件的技巧 要查看.evtx文件的内容,可以使用Windows操作系统提供的Event Viewer工具。以下…

    other 2023年8月5日
    00
  • idea怎么统计项目代码行数

    Idea怎么统计项目代码行数 如果你是一个程序员,你肯定知道,语言的本质是为了表达。通过语言我们可以表达出我们的想法和想要完成的任务。在我们的开发过程中,统计代码行数是非常常见的任务之一。Idea作为一个常见的开发工具,自然也有它自己的代码行数统计工具。 代码行数的重要性 为什么要统计代码行数呢?代码行数可以从多个方面来进行评估和优化程序。它可以帮助我们更好…

    其他 2023年3月29日
    00
  • Vue.js递归组件实现组织架构树和选人功能

    下面是关于 Vue.js 递归组件实现组织架构树和选人功能的完整攻略。 什么是 Vue.js 递归组件 Vue.js 的递归组件是指在组件的模板中可以调用组件自身的一种特殊组件。通过使用递归组件,可以在联动结构中轻松地构建无限级别的嵌套组件和树形结构。 实现组织架构树和选人功能的步骤 数据结构的设计 组织架构树通常是按照树形结构设计的,所以在 Vue.js …

    other 2023年6月27日
    00
  • python实现双向链表原理

    Python实现双向链表原理 双向链表是一种非常经典的数据结构,它的每一个节点都有两个指针,一个指向前驱节点,一个指向后继节点。相对于单向链表,双向链表能够快速地在任意位置插入或删除元素,因此被广泛地应用于实际场景中。 Python语言提供了很多数据结构类型,包括列表、字典、集合等等。但是在某些情况下,双向链表也能够更好地满足我们的需求。本篇文章将详细介绍P…

    other 2023年6月27日
    00
  • windows8系统用户名微软ID和管理员账户概念详解

    Windows 8系统用户名微软ID和管理员账户概念详解 在Windows 8操作系统中,有两个重要的概念:用户名微软ID和管理员账户。本文将详细讲解这两个概念,并提供相关示例说明。 用户名微软ID 用户名微软ID是Windows 8中的一种新用户类型,它的实现是为了与Windows Live和Microsoft在线服务更好地集成。通过使用用户名微软ID,用…

    other 2023年6月27日
    00
  • Win7回收站右键中的属性选项没有了怎么办?恢复Win7回收站右键中的属性选项的方法

    下面是详细的攻略: 问题描述 在Win7回收站右键菜单中,找不到“属性”选项,需要恢复该选项。 解决方法 检查注册表项 首先,我们需要检查相关的注册表项是否存在。按下Win + R快捷键,在运行对话框中输入regedit,打开注册表编辑器。依次展开以下路径: HKEY_CLASSES_ROOT\CLSID\{645FF040-5081-101B-9F08-0…

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