为什么要序列化?序列化你知道哪些?

article/2025/9/17 1:04:08

凡事都要问为什么,在讲解序列化概念和原理前,我们先来了解一下为什么需要序列化。

为什么要序列化?

如果光看定义我想你很难一下子理解序列化的意义,那么我们可以从另一个角度来感受一下什么是序列化。

都玩过游戏么?玩过的同学应该知道游戏里有一个叫『存档』的功能,每次不想玩的时候可以把当前进度存档,下次有时间想玩的时候,直接载入存档就可以接着玩了,这样的好处是之前的游戏进度不会丢失,要是每次打开都重新玩估计大家也没什么耐心了。

如果把面向对象的思想带到游戏的世界,那在我们眼中不管是游戏角色还是游戏中的怪兽、装备等等都可以看成是一个个对象:

  • 角色对象(包含性别、等级、经验值、血量、伤害值、护甲值等属性)

  • 怪兽对象(包含类型、血量、等级等等属性)

  • 装备对象(包含类型、伤害值、附加值等等属性)

在玩游戏的过程中创建一个游戏角色就好像是创建了一个角色对象,拿到一套装备就好像创建了一个装备对象,路上遇到的怪兽等等也都是对象了。

我们再用计算机的思维去思考,创建的这些对象都是保存在内存中的,大家都知道内存的数据是短暂保留的,断电之后是会消失的,但是游戏经过手动存档之后就算你关机几天了,再次进入游戏读取存档,你会发现之前在游戏中创建的角色和装备都还在呢,这就很奇怪了,明明内存的数据断电就消失了,这是为什么?

稍加思考就知道,我们在存档的过程中就是将内存中的数据存储到电脑的硬盘中,硬盘的数据在关机断电后是不会丢失的(别杠,硬盘损坏数据丢失先不考虑)。这个过程就是对象的持久化,也就是我们今天要讲的对象序列化。对象的序列化逆过程就叫做反序列化,反序列化也很好理解就是将硬盘中的信息读取出来形成对象。

什么是序列化?

前面引入游戏的例子是为了让大家生动地理解什么是序列化和反序列化。简单总结一下就是:

  • 序列化是指将对象实例的状态存到存储媒体的过程

  • 反序列化是指将存储在存储媒体中的对象状态装换成对象的过程

用更为抽象的概念来讲:

序列化:把对象转化为可传输的字节序列过程

反序列化:把字节序列还原为对象的过程

序列化的机制

序列化最终的目的是为了对象可以跨平台存储进行网络传输,而我们进行跨平台存储和网络传输的方式就是 IO,而 IO 支持的数据格式就是字节数组

那现在的问题就是如何把对象转换成字节数组?这个很好办,一般的编程语言都有这个能力,可以很容易将对象转成字节数组。

仔细一想,我们单方面的把对象转成字节数组还不行,因为没有规则的字节数组我们是没办法把对象的本来面目还原回来的,简单说就是将对象转成字节数组容易但是将字节数组还原成对象就难了,所以我们必须在把对象转成字节数组的时候就制定一种规则(序列化),那么我们从 IO 流里面读出数据的时候再以这种规则把对象还原回来(反序列化)。

还是拿上面游戏那个例子,我们将正在玩的游戏存档到硬盘,序列化就是将一个个角色对象和装备对象存储到硬盘,然后留下一张原来对象的结构图纸,反序列化就是将硬盘里一个个对象读出来照着图纸逐个还原恢复。

常见序列化的方式

序列化只是定义了拆解对象的具体规则,那这种规则肯定也是多种多样的,比如现在常见的序列化方式有:JDK 原生、JSON、ProtoBuf、Hessian、Kryo等。

(1)JDK 原生

作为一个成熟的编程语言,JDK自带了序列化方法。只需要类实现了Serializable接口,就可以通过ObjectOutputStream类将对象变成byte[]字节数组。

JDK 序列化会把对象类的描述信息和所有的属性以及继承的元数据都序列化为字节流,所以会导致生成的字节流相对比较大。

另外,这种序列化方式是 JDK 自带的,因此不支持跨语言。

简单总结一下:JDK 原生的序列化方式生成的字节流比较大,也不支持跨语言,因此在实际项目和框架中用的都比较少。

(2)ProtoBuf

谷歌推出的,是一种语言无关、平台无关、可扩展的序列化结构数据的方法,它可用于通信协议、数据存储等。序列化后体积小,一般用于对传输性能有较高要求的系统。

(4)Hessian

Hessian 是一个轻量级的二进制 web service 协议,主要用于传输二进制数据。

在传输数据前 Hessian 支持将对象序列化成二进制流,相对于 JDK 原生序列化,Hessian序列化之后体积更小,性能更优。

(5)Kryo

Kryo 是一个 Java 序列化框架,号称 Java 最快的序列化框架。Kryo 在序列化速度上很有优势,底层依赖于字节码生成机制。

由于只能限定在 JVM 语言上,所以 Kryo 不支持跨语言使用。

(6)JSON

上面讲的几种序列化方式都是直接将对象变成二进制,也就是byte[]字节数组,这些方式都可以叫二进制方式。

JSON 序列化方式生成的是一串有规则的字符串,在可读性上要优于上面几种方式,但是在体积上就没什么优势了。

另外 JSON 是有规则的字符串,不跟任何编程语言绑定,天然上就具备了跨平台。

总结一下:JSON 可读性强,支持跨平台,体积稍微逊色。

JSON 序列化常见的框架有:

fastJSONJacksonGson 等。

序列化技术的选型

上面列举的这些序列化技术各有优缺点,不能简单地说哪一种就是最好的,不然也不会有这么多序列化技术共存了。

既然有这么多序列化技术可供选择,那在实际项目中如何选型呢?

我认为需要结合具体的项目来看,比较技术是服务于业务的。你可以从下面这几个因素来考虑:

(1)协议是否支持跨平台

如果一个大的系统有好多种语言进行混合开发,那么就肯定不适合用有语言局限性的序列化协议,比如 JDK 原生、Kryo 这些只能用在 Java 语言范围下,你用 JDK 原生方式进行序列化,用其他语言是无法反序列化的。

(2)序列化的速度

如果序列化的频率非常高,那么选择序列化速度快的协议会为你的系统性能提升不少。

(3)序列化生成的体积

如果频繁的在网络中传输的数据那就需要数据越小越好,小的数据传输快,也不占带宽,也能整体提升系统的性能,因此序列化生成的体积就很关键了。

小结

(1)为什么我们要序列化?

因为我们需要将内存中的对象存储到媒介中,或者我们需要将一个对象通过网络传输到另外一个系统中。

(2)什么是序列化?

序列化就是把对象转化为可传输的字节序列过程;反序列化就是把字节序列还原为对象的过程。

(3)序列化的机制

序列化最终的目的是为了对象可以跨平台存储进行网络传输,而我们进行跨平台存储和网络传输的方式就是 IO,而 IO 支持的数据格式就是字节数组

将对象转成字节数组的时候需要制定一种规则,这种规则就是序列化机制。

(4)常见序列化的方式

现在常见的序列化方式有:JDK 原生、JSON、ProtoBuf、Hessian、Kryo等。

(5)序列化技术的选型

选型最重要的就是要考虑这三个方面:协议是否支持跨平台序列化的速度序列化生成的体积


http://chatgpt.dhexx.cn/article/9VuO6cx2.shtml

相关文章

说说什么是序列化,如何实现序列化

分析&回答 序列化机制 序列化机制(包括序列化和反序列化)的本质是用流将对象读到内存和写入外存。序列化机制的意义就是将对象脱离程序运行独立存在。通过网路或跨平台传输对象,传递的参数与返回值都实现序列化机制。实现序列化需要实现…

java序列化详解

一、序列化与反序列化 序列化:指堆内存中的java对象数据,通过某种方式把对存储到磁盘文件中,或者传递给其他网络节点(网络传输)。这个过程称为序列化,通常是指将数据结构或对象转化成二进制的过程。 即将对…

序列化和反序列化的底层实现原理是什么?

序列化和反序列化作为Java里一个较为基础的知识点,大家心里也有那么几句要说的,但我相信很多小伙伴掌握的也就是那么几句而已,如果再深究问一下Java如何实现序列化和反序列化的,就可能不知所措了!遥记当年也被问了这一…

序列化和反序列化

我以前确实对序列化,乃至现在也是不是很熟悉,有时候查找资料,但依旧懵懵懂懂,不过还好遇到一个博主,确定写的挺好的,链接会放再底部 废话不多说,先看官网定义: 序列化 (Serializat…

我把序列化玩成了这样,吊锤了一波面试官

我们都知道,新建一个对象的时候实现 Serializeable 接口,但为什么要这么做?什么时候这样子做?这样子做会不会出现幺蛾子?阿粉一个三连差点把自己都问懵逼了…… 那接下来,大家就和阿粉一起简单了解一下这个…

什么是序列化? 如何实现(反)序列化 序列化的应用

1. 什么是序列化与反序列化,什么情况需要序列化1.1 序列化序列化是什么序列化的目的什么情况需要序列化 1.2 反序列化反序列化是什么反序列化的目的 2. Java中的序列化与反序列化2.1 如何实现序列化Java序列化的规定序列化的API实现(反)序列化的示例对象在硬盘上的存…

1.传输线驻波比

Transmission Line & Active Voltage Standing Wave Ratio 1.1 信号完整性概述 数字电路的出现极大地提高了电子产品的抗干扰能力,随着电路的工作频率不断提高,这种抗干扰能力逐渐显得有些“力不从心”。特别是在高速电路的范畴,“理想互…

驻波比,功率计原理,短波机驻波测量

文章内容转载自http://bbs.cqcqcq.com/thread-1627-1-1.html 衡量功率反射大小的量称为「反射系数」,常用Γ (音 gamma) 或ρ (音 rho) 表示。为了讨论简单起见,我们假设负载阻抗为纯阻性的。反射系数定义为: ρ (反射电压波) / (入射电压波)…

入射波反射波和驻波的特性推导

入射波反射波和驻波的基本推导 学习雷达过程中,发现阻抗匹配是一道迈不过去的坎,而阻抗匹配、能量传输与电压驻波比又有千丝万缕的联系,而电压驻波比则与反射波、入射波等相关的特性有关,于是写下此文章记录一下推导过程。 懒得正…

反射系数、驻波比、S参数之间的关系

反射系数、驻波比、S参数之间的关系! 转载▼ 回波损耗(Return Loss): 入射功率/反射功率, 为dB数值 反射系数(Г): 反射电压/入射电压, 为标量 电压驻波比(Voltage Standing Wave Ration): 波腹电压/波节电压 S参数: S12为反向传输系数,也就是隔离。…

馈线中的VSWR电压驻波比

在射频信号馈线传输中,信号传输有一个概念:驻波比。 这个概念好理解,就是一个波进去,在终端由于不匹配形成反射波回来。 但是不是那么好想像,叠加后是啥模样的波形。 借助pythonmatplotlib可以方便模拟出来&#xf…

简单了解什么是驻波比?

驻波比全称为电压驻波比,又名VSWR,为英文Voltage Standing Wave Ratio的简写,在理解电压驻波比之前先要明白什么是“驻波”。 假设两个波长相同的波以相反的方向传播,绿线波朝着左方向旋转,蓝线波朝着右方向旋转&…

驻波比理解

VSWR(Voltage Standing Wave Ratio)代表电压驻波比。要完全理解这个术语,需要知道什么是“驻波”。 假设两个波长相同的波以相反的方向传播,如下所示。一个波表示为蓝线,它朝着正确的方向旋转。另一个波用绿线表示,它在左方向旋转…

电压驻波比,回波损耗,传输损耗,电压反射系数,功率传输,功率反射换算表

回波损耗(Return Loss):入射功率/反射功率, 为dB数值反射系数(Г):反射电压/入射电压, 为标量电压驻波比(Voltage Standing Wave Ration): 波腹电压/波节电压S参数:S12为反向传输系数,也就是隔离。S21为正向传输系数,也…

天线的驻波比

驻波比是衡量天线性能的重要参数之一,体现了天线向外界空间辐射能量的潜力。这是一个标量的参数,还有史密斯圆图(the Smith Chart)来衡量天线的阻抗特性,可以分析天线是感性还是容性的,并指明了调整天线的方向。 目录​ 一、什么是驻波比VSWR或者SWR

关于驻波比(VSWR)的详细解析

from滤波器 ◆ ◆ ◆ 文 | 滤波器(ID:Filter_CN) 驻波比(VSWR)用来检测天馈线系统、射频接头以及所有的连接到基站的射频设备的工作状态。VSWR过高会导致掉话、高误码率,而且由此引入的发射/接受功率的衰减会导致小…

射频回波损耗、反射系数、电压驻波比、S参数的含义与关系

以二端口网络为例,如单根传输线,共有四个S参数:S11,S12,S21,S22,对于互易网络有S12=S21,对于对称网络有S11=S22,对于无耗网络,有S11*S…

【回波损耗(dB)和电压驻波比(VSWR)之间的关系】

回波损耗(dB)和电压驻波比(VSWR)之间的关系 反射系数(Г / Rho) Г=反射波振幅/入射波振幅 =(传输线特性阻抗-负载阻抗) / (传输线特性阻抗负载阻抗) 回波损耗( RL ) 回波损耗: 回波损耗,又称为反射损…

RF(射频) - VSWR(电压驻波比)

VSWR代表电压驻波比(Voltage Standing Wave Ratio)。要完全理解这个术语,你需要知道什么是“驻波”。 你可能已经在高中物理课上学到了驻波。只要刷新你的想法,让我解释一下驻波是什么。 假设具有相同波长的两个波沿相反方向传播…

天线参数-自用1

天线参数 1丶 天线谐振频率 Resonance Frequency 2丶驻波比 指的是行驻波的电压波腹值和电压波节值之比 2.1 驻波 驻波即两个反方向波的合成波形,该合成波相位不变,幅度变化,节点位置(值 0)不会发生变化。 幅度最大…