| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 网络协议 -> 高薪程序员&面试题精讲系列29之为什么要进行序列化与反序列化? -> 正文阅读 |
|
[网络协议]高薪程序员&面试题精讲系列29之为什么要进行序列化与反序列化? |
一. 面试题及剖析1. 今日面试题
2. 题目剖析Java开发中,我们经常要进行信息的传输,传输的数据类型可以包括基本类型、String等对象类型,也可以是文本、图片、音频、视频等,那么我们在进行数据传递的过程中,如何确保这些信息的高效、安全传输? 另外随着现在分布式项目的开发,我们在Java项目中会经常使用各种RPC进程间通信技术,比如HttpClient、URLConnection、Dubbo、RestTemplate、Ribbon、Feign、Netty等各种框架。所有的这些通信框架都可以实现跨进程传递数据,而传递的数据如果是对象类型,无一例外都会要求该对象必须实现序列化。 所以面试官在考察我们对这些框架的底层掌握情况时,一般都会让我们讲一下这些通信框架的底层实现,而所谓的底层实现,其中的一个回答方向就是要讲清楚这些通信框架中是如何进行对象序列化的。 二. 什么是序列化和反序列化1. 序列化Java序列化就是把Java对象转换成有序的字节流的过程,它是一种处理对象流的机制,可以很方便的保存内存中的Java对象状态,并可以进行重建。同时序列化也方便了对象传输,使得该对象能够在网络上传输或者保存在本地文件中,并且确保了对象在传递和保存过程中的完整性和可传递性。 如果你看过小说《三体》,就可以对序列化和反序列化有着比较好的理解了。我们可以把序列化的过程,理解为歌者文明对宇宙使用了二向箔进行了降维打击,把三维世界变成了二维世界。 虽然《三体》小说中的降维打击是不能逆转的,但是Java中的序列化和反序列化却是可以互相可逆转的。 2. 反序列化Java反序列化就是把有序的字节序列重新恢复为Java对象的过程。一般客户端从文件中或网络上获得序列化后的对象字节流后,会根据字节流中所保存的对象状态及描述信息,通过反序列化重建对象,相当于再把上面的二维世界再恢复为三维世界。 三. 为什么要序列化和反序列化那为什么要进行序列化和反序列化呢?其实要回答这个问题,这里我们只需要回答出序列化和反序列化的作用于优点即可。 1. 序列化和反序列化的作用根据上面序列化和反序列化的概念,我们可以提取出序列化和反序列化的2个核心作用:
举个栗子,假如我们的Web 服务器上,要存储10w万个用户的并发会话信息,这时就可能要保存10万个Session 对象,这时服务器的内存很可能会吃不消。那么这时候,就可以把一些 Session 先序列化,让这些Session离开内存空间,持久化存储到硬盘中。当后面需要调用这些Session时,再把保存在硬盘中的Session对象还原到内存中。 另外当两个进程之间进行远程通信时,彼此可以发送各种类型的数据,包括文本、图片、音频、视频等, 而这些数据都会以二进制序列的形式在网络上传送。同样的序列化与反序列化则实现了进程通信间的对象传送,发送方需要把这个Java对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为Java对象。 2. 序列化和反序列化的优点所以根据上面序列化的作用,我们可以总结出序列化和反序列化的优点,如下:
所以,基于序列化和反序列化的作用与优点,我们在开发时就需要这种技术。 四. 什么时候进行序列化和反序列化既然序列化和反序列化这么重要,有这么多优点,那我们该什么时候进行序列化和反序列化呢?这里?壹哥?先给各位说一个常见的使用场景: 只要我们想对内存中的对象进行持久化,或者想进行网络传输, 这时都需要进行序列化和反序列化。 所以进行序列化和反序列化的情况,一般就两种:
总的来说,就是如果我们想将内存中的对象持久化到磁盘、数据库中, 或者当我们需要与浏览器进行交互时, 需要实现RPC远程通信时, 都要进行序列化和反序列化。 五. 如何实现序列化和反序列化1. 序列化与反序列化API简介在Java中实现序列化和反序列化操作,我们可以使用Serializable接口,再结合使用ObjectOutputStream(对象输出流) 和ObjectInputStream(对象输入流)即可实现,所有相关API如下:
2. 示例代码接下来 壹哥 通过编写一段示例代码,给大家展示如何实现序列化和反序列化。 2.1 定义Person类 这里我定义了一个Peron类,让该类实现Serializable接口,并且给该类中生成一个serialVersionUID序列号。
注意: 如果该类不实现Serializable序列化接口,在进行序列化时会出现如下异常。
2.2 实现序列化与反序列化 Person中实现了序列化接口之后,接下来我再进行序列化与反序列化操作,主要是使用ObjectOutputStream(对象输出流) 和ObjectInputStream(对象输入流) 这两个I/O流API。
2.3 执行结果 代码执行完毕后,我们可以看到序列化与反序列化的执行结果。因为Person类的age字段使用了transient关键字,所以不会进行序列化操作。Person对象被持久化保存到了Person.txt文件中,该文件如果打开之后会看到一堆无意义的字符序列。 3. Externalizable接口(可选)另外我们其实也可以通过实行Externalizable接口来实现序列化,这是Serializable接口的一个子类,我们可以通过writeExternal()和readExternal()方法来进行序列化和反序列化操作。 六. 结语最后 壹哥 把今天的面试题给大家做个简单的总结,今天面试题回答的要点如下。
|
|
网络协议 最新文章 |
使用Easyswoole 搭建简单的Websoket服务 |
常见的数据通信方式有哪些? |
Openssl 1024bit RSA算法---公私钥获取和处 |
HTTPS协议的密钥交换流程 |
《小白WEB安全入门》03. 漏洞篇 |
HttpRunner4.x 安装与使用 |
2021-07-04 |
手写RPC学习笔记 |
K8S高可用版本部署 |
mySQL计算IP地址范围 |
|
上一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 9:36:49- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |