JAVA序列化和反序列化的底层实现原理解析

JAVA序列化和反序列化的底层实现原理解析

序列化与反序列化的概念

序列化

序列化是指将对象转换成可传输的格式(例如字节码),并且可以在将来重新创建出与原对象完全相同的副本。序列化操作可以在网络上传输对象,或者将对象存储到本地磁盘上。

反序列化

反序列化是指将序列化后的数据流还原为原来的对象的操作。也就是说,反序列化能够重新创建出一个和已序列化的对象完全相同的对象实例。

序列化原理

序列化的实现

Java 序列化由 ObjectOutput 和 ObjectOutputStream 两部分组成。

具体来讲,ObjectOutput 在写出对象前会先写出该对象的 MetaData,即对象类型信息和属性值信息,然后使用 java.io.Serializable 接口中的 writeObject 方法将实例对象写入输出流中。

而 ObjectOutputStream 实现了 ObjectOutput 接口,在序列化时也采用了写出 MetaData 和 对象信息的方式,但在写出 MetaData 时,对同一类型的 MetaData 只创建一个。在写出对象时,该对象的类型信息和之前已写出的类型信息进行匹配,如果找到相同的类型信息,就使用之前的 MetaData,否则就新创建一个 MetaData 并记录下来。

序列化的缺点

Java 序列化存在以下缺点:

  1. 序列化后的数据量大,序列化后的码流默认为二进制编码,体积较大,不利于网络传输。
  2. 序列化运行效率较低,可能会影响系统的性能。
  3. 序列化后的数据不便于人阅读。

反序列化原理

反序列化可以使用 ObjectInput 和 ObjectInputStream 实现。

ObjectInput 接口有一个 readObject 方法,可以将序列化后的数据流反序列化成相应的对象。与序列化类似,反序列化时也需先读取定制化的 MetaData,根据 MetaData 对读入的二进制序列化数据进行解码,并转化为实例对象。

同时,ObjectInputStream 可以通过 setAllowList() 方法设置反序列化时允许读取的类白名单或黑名单,以防止序列化漏洞。

示例说明

以下是一个序列化示例:

public class User implements Serializable {
    String name;
    int age;

    // 省略构造函数和 Getter/Setter 方法

    public static void main(String[] args) throws IOException {
        FileOutputStream fileOut = new FileOutputStream("user.ser");
        ObjectOutputStream out = new ObjectOutputStream(fileOut);

        User user = new User("Jack", 18);
        out.writeObject(user);

        out.close();
        fileOut.close();
    }
}

该代码片段将 User 对象序列化到 user.ser 中。

以下是一个反序列化示例:

public class User implements Serializable {
    String name;
    int age;

    // 省略构造函数和 Getter/Setter 方法

    public static void main(String[] args) throws IOException, ClassNotFoundException {
        FileInputStream fileIn = new FileInputStream("user.ser");
        ObjectInputStream in = new ObjectInputStream(fileIn);

        User user = (User) in.readObject();

        in.close();
        fileIn.close();
    }
}

该代码片段从 user.ser 中读出序列化后的 User 对象,并将其反序列化为 Java 对象实例。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JAVA序列化和反序列化的底层实现原理解析 - Python技术站

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

相关文章

  • js中return false(阻止)的用法

    JavaScript中的return false可以用来阻止某些事件的发生或者是提交某些表单的行为。它是常用的一种代码技巧,下面将详细讲解其用法。 一、阻止事件发生 在JavaScript中,我们经常需要对某些事件进行监听,并在事件触发时执行相应的操作。例如,在点击一个按钮时,我们可能需要执行一些操作并且阻止浏览器跳转到该按钮所指的链接。我们可以使用retu…

    Java 2023年6月15日
    00
  • 什么是分代垃圾回收?

    以下是关于分代垃圾回收的详细讲解: 什么是分代垃圾回收? 分代垃圾回收是一种常见的垃圾回收算法。其原理是将内存空间分为不同的代,每一代对象具有不同的生命周期。在程序运行过程中,垃圾回收器会根据对象的生命周期将其分配到不同的代中,然后对不同代的对象采用不同的垃圾回收策略,以提高垃圾回收的效率和性能。 分代垃圾回收通常将内存空间分为三代:年轻代、中年代和老年代。…

    Java 2023年5月12日
    00
  • jQuery性能优化的38个建议

    下面是详细讲解“jQuery性能优化的38个建议”的完整攻略。 前言 jQuery 是一个非常流行的 JavaScript 库,它可以帮助我们更加高效地进行网页开发。但是,在实际使用中,我们可能会遇到一些性能问题,进而影响网页的加载速度和性能。本篇攻略将向大家介绍 jQuery 性能优化的38个建议,帮助大家更好地优化网页性能。 性能优化建议 尽量使用 ID…

    Java 2023年5月20日
    00
  • Java实现excel表格转成json的方法

    下面是详细讲解“Java实现excel表格转成json的方法”的完整攻略。 第一步:导入依赖 使用Java实现excel表格转成json,我们需要用到以下两个依赖: jackson:Java的JSON处理库 poi:操作Excel表格的Java库 <dependencies> <dependency> <groupId>c…

    Java 2023年5月26日
    00
  • SpringBoot–Banner的定制和关闭操作

    关于SpringBoot的Banner定制和关闭操作,下面是我的攻略: 什么是Banner 在介绍Banner的定制和关闭操作之前,我们先来了解一下什么是Banner。在SpringBoot应用程序启动的时候,会输出一个默认的Banner,它是一张ascii字符组成的图案,可以设置不同的颜色、字体、大小等属性,用于展示应用程序的信息,例如名称、版本、版权信息…

    Java 2023年5月19日
    00
  • JSP制作简单登录界面实例

    下面是在JSP中制作简单登录界面的完整攻略。 步骤1:创建JSP页面 首先,创建一个简单的JSP页面来显示登录表单。在该页面中添加必要的元素,如用户名、密码、提交按钮等。 示例代码: <!DOCTYPE html> <html> <head> <title>Login Page</title> &l…

    Java 2023年6月15日
    00
  • Ajax技术(WEB无刷新提交数据)-

    Ajax技术 什么是Ajax? Ajax全称为Asynchronous JavaScript And XML(异步JavaScript和XML),是一种用于创建快速动态网页的技术。 使用Ajax技术,网页可以实现异步加载和提交数据,无需刷新整个页面,提高了用户体验,减轻了服务器的负担。 Ajax的基本原理 Ajax通过在后台与服务器进行少量数据交换,实现无刷…

    Java 2023年5月23日
    00
  • jsp留言板源代码三: 给jsp初学者.

    标题: JSP留言板源代码三: 给JSP初学者的攻略 1. JSP留言板源代码三简介 该源代码是一个基于JSP和Servlet技术实现的留言板网站。本攻略主要面向JSP初学者,介绍留言板的基本框架和关键实现细节。 2. 源代码结构简介 源代码结构如下: +—WEB-INF | +—classes | | +—com | | \—example…

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