为什么要序列化
序列化的目的就是为了对象可以在网络层进行传输,
比如通过后端传给前端数据。
什么是序列化
我们以Java为例。
序列化就是把对象转化为可传输的字节序列过程,这个字节序列可以是字符串,比如JSON格式的字符串,把内存中的java对象转化成JSON格式的字符串的过程,就是序列化的过程。
为什么转化成字符串就算是序列化呢?
因为字符串实现了
Serializable接口,实现了Serializable接口的类,便可以通过网络层进行传输(序列化的目的就是为了在网络层进行传输)。
由此可见,String类实现了Serializable接口,其实你也可以自己创建一个类,去实现这个接口,然后你的类的对象也就完成了序列化,可以直接通过网络层进行传输,然而这种方式我们通常不建议,因为。
直接使用 java.io.Serializable 接口传输对象需要确保参与方都能识别和解析序列化格式,并具有相同的对象类定义,否则可能会出现兼容性问题。此外,由于序列化对象会增加数据传输量和复杂度,因此对于大型或频繁传输的数据,使用 JSON 格式传输会更加高效。
当然,这并不代表 java.io.Serializable 接口在网络传输中没有应用场景。实际上,在某些特定的应用场景中,如果需要精细地控制对象的序列化过程、保护数据安全性等,使用 java.io.Serializable 接口传输对象可能更为合适。
但是我们一般都采用JSON格式的字符串的方式来完成对象的序列化,以达到从后端向前端通过网络来进行传输的目的。
哪些对象是我们需要进行序列化的?
我想说的是,你希望传输的Java对象是需要进行序列化的。你也许会说这不废话吗,我要从网络层传输,当然要序列化。
但是有些类的对象java已经帮我们序列化好了,比如
-
java.lang.String: 字符串对象可以被序列化,这意味着可以在客户端和服务器之间轻松传输字符串。
-
java.lang.Integer、java.lang.Double 等基本类型的封装类: 基本类型的封装类可以被序列化,这意味着可以在客户端和服务器之间轻松传输数字。
-
java.util.Date: 日期对象可以被序列化,这使得在需要将数据存储到数据库中时,可以更轻松地直接将对象写入数据库。
-
java.util.List、java.util.ArrayList、java.util.HashMap等集合类: 常用的集合类也可以被序列化,这意味着可以轻松地在客户端和服务器之间传递列表和映射集。
-
java.io.Serializable: Serializable 接口的实现类可以被序列化,如 java.net.Socket、java.net.URL 等网络相关的类。
等等等等,总而言之,判断一个自带的Java类有没有被序列化,你就点进去看看有没有实现Serializable 接口
这些都不需要我们进行序列化,需要我们进行序列化的是我们自己创建的java对象,因为我们自己创建的Java对象通常是不实现Serializable 接口的。此时我们通常就会把他转化成JSON格式的字符串进行传输。
采用JSON格式的字符串进行传输优点如下
- 通用,现在主流的前后端交互,均使用JSON格式的字符串来进行前后端数据的传输
- 灵活,JSON字符串可以表示各种复杂的数据结构,对象啊,数组啊,集合啊等等,可以随意嵌套使用
如何序列化为JSON格式的字符串
我们通常采用外部的框架来进行实现,常见的可以把一个Java对象转化成JSON格式的字符串的框架有alibaba的fastjson。
即使有些已经进行了序列化比如HashMap等,我们在传输的过程中有时候遵循前后端通过JSON数据传输的规范,我们依然把他转化成JSON字符串来传输,尽管一个HashMap的对象已经支持序列化,可以直接传输。
将fastjson引入到pom依赖文件中
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.80</version>
</dependency>
在你需要进行序列化的地方直接调用JSONObject.toJSONString方法,把对象传入就可以完成把对象转化成JSON格式的字符串的过程,此时这个字符串就可以通过网络任意传输了,因为字符串本身是支持序列化。
代码看不懂没关系,只在意红框里的内容就行。
到此,序列化就讲完了,想必你对序列化也有了一定的认识。
感谢观看💕