百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

我赌你不懂系列:序列化是什么

wptr33 2025-03-10 21:13 13 浏览

前言

什么是序列化?工作中什么时候用到序列化了?

为什么实现了java.io.Serializable接口就能序列化?

java中serialVersionUID 为什么不能改变?

Serializable序列化和json序列化有什么关系?

你都会哪几种对象深拷贝方式?

以上抛出了几个问题,大家都能回答上来吗?回答不上来的话就接着往下看吧。

前提知识

讲解之前先扩充一些前提知识。

二进制协议和文本协议

首先我们要知道所有的数据在底层的传输都是二进制流,这点是毋庸置疑的。

那什么是文本协议?什么是二进制协议呢?

文本协议

文本协议一般是由一串ACSII字符组成的数据,这些字符包括数字,大小写字母、百分号,还有回车(\r),换行(\n)以及空格等等。

文本协议设计的目的就是方便人们理解、读懂,所以,协议中通常会加入一些特殊字符用于分隔。

比如日常中发送请求时经常用到的方式: xml, json, formData,他们虽然格式不同,但都有一个特征,自带描述信息。

formData 31bytes

account=sqrtcat&password=123456

json 41bytes

{"account":"sqrtcat","password":"123456"}

xml 94bytes

 sqrtcat 123456

但为了便于解析,文本协议不得不添加一些冗余的字符用于分隔命令,降低了其传输的效率;而且只适于传输文本,很难嵌入其他数据,比如一张图片。

二进制协议

二进制协议就是一串字节流,通常包括消息头(header)和消息体(body),消息头的长度固定,并且消息头包括了消息体的长度。这样就能够从数据流中解析出一个完整的二进制数据。

二进制协议,没有冗余字段,传输高效,方便解析(固定长度,并且可以直接比较字节),缺点就是定义的比较死,哪个位置有哪些东西,是什么意义是定义死的,场景单一。

序列化

首先让百度来解释一下什么是序列化:

序列化 是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。之后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。

那我们工作中什么时候用到序列化了?

在创建一个Java类时实现java.io.Serializable接口,将你的对象进行网络传输或者持久化;

使用spring注解@ResponseBody或者使用JSON框架(jackson、Gson、fastjson)等给前端返回json数据。

以上都涉及到了序列化。

为什么实现了java.io.Serializable接口就能序列化?

Java自己提供了一种序列化机制,这种机制能将一个对象序列化成二进制形式,用于写入磁盘或输出到网络,同时将从网络或者磁盘中读取的字节数组,反序列化成对象,在程序中使用。

便是实现java.io包下的Serializable接口,使用JDK 提供的两个输入、输出流对象 ObjectInputStream 和 ObjectOutputStream便可以对java对象进行序列化和反序列化。

java中serialVersionUID 不能改变的原因是避免反序列失败,可能会抛出序列化运行时异常。

Java序列化缺陷

实际工作中会发现我们自己很少会使用java提供的序列化,主要是因为JDK默认的序列化存在着一些非常严重的缺陷,比如它是无法实现跨平台和跨语言的,意思是我们在java中序列化的对象是无法被其他语言或者是被浏览器反序列的。

为了解决这一问题通常将Java对象转换为XML或Json格式进而实现网络传输。

JSON

看下定义:

JSON(JavaScript Object Notation, JS对象简谱)是一种轻量级的数据交换格式。它基于 ECMAScript(European Computer Manufacturers Association, 欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。它和xml一样都是一种数据交换格式。

我们在后端将需要返回的数据通过json处理成json字符串后转为二进制在网络中传输,浏览器会解析为json字符串,进而我们可以再通过json将json字符串转换为对象。

json 是一种很简洁的协议,但可惜的是,它只能传递基本的数型(int,long,string等),但不能传递byte类型。如果想要传输图片等二进制文件的话,是没办法直接传输。

json序列化在webapi项目中非常流行。因为json非常的直观明了,调用者能够很直观的知道返回的数据信息。

二进制序列化一般情况下数据大小会比xml,json的序列化的更小。但是二进制则不能直观的知道数据的内容信息。

深拷贝

提供几种Java对象深拷贝方案:

//1.构造函数  《不推荐》
//2.implements Cloneable 重写clone()   《不推荐》
//3.序列化后反序列化     《推荐》
// 使用Apache Commons Lang序列化进行深拷贝
User copyUser = (User) SerializationUtils.clone(user);

// 使用Gson序列化进行深拷贝
Gson gson = new Gson();
User copyUser = gson.fromJson(gson.toJson(user), User.class);

// 使用Jackson序列化进行深拷贝
ObjectMapper objectMapper = new ObjectMapper();
User copyUser = objectMapper.readValue(objectMapper.writeValueAsString(user), User.class);

上面我们可以通过json序列化的方式进行对象深拷贝,下面再提供一种使用二进制序列化的方式进行List<对象>深拷贝的实现方式:

    public static  List copyList(List source) {
        try {
            ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
            ObjectOutputStream out = new ObjectOutputStream(byteOut);
            out.writeObject(source);

            ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray());
            ObjectInputStream inStream = new ObjectInputStream(byteIn);
            List list = (List) inStream.readObject();

            inStream.close();
            byteIn.close();
            out.close();
            byteOut.close();
            return list;
        } catch (Exception e) {
            log.info(e.getMessage(), e);
        }
        return null;
    }

相关推荐

数据库基础:mysql主从集群搭建

文章首发于微信公众号:java架构师进阶之路前言:Mysql数据库没有增量备份的机制,当数据量太大的时候备份是一个很大的问题。还好mysql数据库提供了一种主从备份的机制,其实就是把主数据库的所有的...

Mysql-cluster搭建

前期准备准备五台虚拟机:ip地址分别为:192.168.1.211管理节点192.168.1.64SQL节点192.168.1.65SQL节点192.168.1.70数据节点192.168.1...

mysql 主从数据库搭建

一、创建目录在dev/htb下面创建文件夹master01htb]#mkdirmysql/master01-p2)进入master01...

从零搭建高可用的 MySQL 主从复制架构(基于 Linux 实战指南)

背景在生产环境中,单点MySQL数据库容易成为性能瓶颈或单点故障源。搭建MySQL主从复制架构,可以实现读写分离、高可用,提升系统的整体稳定性与扩展性。...

「MySQL 8」MySQL 5.7都即将停只维护了,是时候学习一波MySQL 8了

MySQL8新特性选择MySQL8的背景:MySQL5.6已经停止版本更新了,对于MySQL5.7版本,其将于2023年10月31日停止支持。后续官方将不再进行后续的代码维护。另外,...

Mysql启动选项和配置文件

Mysql启动选项和配置文件Mysql启动方式下面的启动命令都需要依赖在Linux环境下配置的Mysql环境变量...

centos安装mysql操作手册

1.下载Mysql首先去Mysql官网下载安装包,网址https://dev.mysql.com/downloads/mysql/推荐大家下载Linux通用版本的,便于管理安装位置,也方便一台服务器...

MySQL安装

MySQL的安装过程因操作系统的不同而有所差异。以下是在几种常见操作系统上安装MySQL的基本步骤:Windows下载MySQL:访问MySQL官方网站下载页面:MySQLDownloads...

MySQL数据库安装教程

前言今天就带各位小伙伴学习数据库技术。数据库技术是Java开发中必不可少的一部分知识内容。也是非常重要的技术。...

MySQL学到什么程度?才有可以在简历上写精通

前言如今互联网行业用的最多就是MySQL,然而对于高级Web面试者,尤其对于寻找30k下工作的求职者,很多MySQL相关知识点基本都会涉及,如果面试中,你的相关知识答的模糊和不切要点,基...

一起免费考 MySQL OCP 认证啦

前言:在1995年,首个MySQL版本发布,为庆祝MySQL诞辰30周年,OracleUniversity在限定期间内推出了多个MySQL的免费培训课程与认证,其中也包括My...

教程2 | 制作用户管理系统

一、项目简介用户管理系统是一个基于C/S模式的小型管理系统,使用了GUI技术来实现管理系统的页面效果,该管理系统可以对用户的信息,比如姓名、年龄、密码和地址等进行增删改查操作。用户管理系统通过JDBC...

红帽Linux中安装mysql8详细步骤

注意:我写的解压路径和截图路径不一致,仅供参考先前往官网下载mysql8下载地址:https://dev.mysql.com/downloads/选择指定版本和系统下载命令...

MySQL主从配置

主从原理MySQL主从又叫做Replication、AB复制。简单讲就是A和B两台机器做主从后,在A上写数据,另外一台B也会跟着写数据,两者数据实时同步的。...

mysql的主从搭建以及实现主从切换方法

主从搭建的方法:a.准备两台服务器...