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日

相关文章

  • Linux中mkdir函数与Windows中_mkdir函数的区别

    Linux中的mkdir函数与Windows中的_mkdir函数虽然在功能上都是用于创建目录,但由于两种操作系统的文件系统和API实现方式不同,所以在使用时会有一些区别。 在Linux系统下,mkdir函数的原型如下: int mkdir(const char *pathname, mode_t mode); 其中,pathname参数表示新创建目录的路径,…

    other 2023年6月26日
    00
  • elementUI el-table二次封装的详细实例

    下面我将详细讲解如何进行 ElementUI 的 el-table 二次封装。 首先,我们需要明确以下几点: 1.什么是二次封装? 二次封装是指在原有的组件基础上再次封装,使其更加适用于项目中的使用场景。 2.为什么要进行二次封装? 二次封装有以下几点好处: 可以提高代码的复用性和可维护性; 可以使代码更加简洁易懂; 可以更好的满足项目的需求。 有了以上的认…

    other 2023年6月25日
    00
  • 求32位机器上unsigned int的最大值及int的最大值的解决方法

    求32位机器上unsigned int的最大值及int的最大值的解决方法 在32位机器上,unsigned int的最大值可以通过以下步骤求得: 确定机器上整数类型的位数:32位机器上,整数类型的位数为32位。 计算unsigned int的最大值:由于unsigned int是无符号整数类型,它的取值范围是从0到2^32-1。因此,unsigned int…

    other 2023年7月28日
    00
  • linux文本编辑常用快捷键-相关文章

    Linux文本编辑常用快捷键-相关文章 在Linux操作系统中,文本编辑是经常需要用到的功能之一。为了提高操作效率,下面是一些常用的Linux文本编辑快捷键: 普通模式快捷键 在普通模式下,可以使用以下快捷键: 移动光标:h(左)、j(下)、k(上)、l(右) 向前/向后移动一个单词:w、e、b 删除当前光标后的字符/单词/行末:x、dw、d$ 复制当前光标…

    其他 2023年3月28日
    00
  • Nginx用户认证配置方法详解(域名/目录)

    下面是Nginx用户认证配置方法详解的完整攻略。 什么是Nginx用户认证? 在Nginx中,用户认证是指通过验证用户名和密码,来限制特定路径或资源只能被特定用户访问。Nginx用户认证可以用于保护网站后台管理页面、个人文件存储和对特定内容的访问等场景。 Nginx用户认证配置方法 步骤1:安装htpasswd工具 htpasswd是一个用于生成和更新基于文…

    other 2023年6月27日
    00
  • Android开发之拼音转换工具类PinyinUtils示例

    Android开发之拼音转换工具类PinyinUtils示例 在Android开发中,有时我们需要将汉字转换为拼音,以便进行搜索、排序等操作。这时可以使用拼音转换工具类PinyinUtils来实现。下面是使用PinyinUtils的示例说明: 示例1:将汉字转换为拼音 String chinese = \"你好\"; String pin…

    other 2023年10月13日
    00
  • mysql去重的方法整理

    以下是“MySQL去重的方法整理”的完整攻略: 1. 去重的概念 在MySQL中,去重是指从查询结果中删除重复的行。当查询结果包含多个相同的行时,去重可以帮助我们只显示一次这些行,从而使查询结果更加简洁和易读。 2. MySQL去重的方法 MySQL提供了多种去重的方法,包括使用DISTINCT关键字、GROUP BY子句和HAVING子句等。下面分别介绍这…

    other 2023年5月8日
    00
  • 孤岛惊魂5cpy版无法存档怎么办 cpy版无法存档解决方法介绍

    针对“孤岛惊魂5cpy版无法存档怎么办 cpy版无法存档解决方法介绍”,我提供以下攻略说明: 问题描述 孤岛惊魂5是一款非常受玩家喜爱的游戏,但某些玩家在使用cpy版的时候发现无法存档,无法正常游玩。这是令人非常困扰的问题。 解决方案 针对这个问题,我们提供以下几种解决方案。 方案一:修改cpy.ini配置文件 找到游戏目录下的cpy.ini配置文件,一般在…

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