序列化
前言
提到序列化,总感觉不是那么了解,在网上查来查去,最后看到了JSON.stringify()
方法。这个和序列化有关系吗?因为我也是做前端的嘛,也算是做了很长长时间,发了那么多请求,这个知识竟然不知道!!!之前只知道用,但是从来不考虑为什么要用。
学习某个知识,知道它怎么用是最基础的,我们应该还需要清楚为什么用它,要有深入思考的能力。闲话不多说,我做一下总结吧。
序列化
谈及定义,前端和后端的序列化还是有区别的。
前端
定义:将对象转换成字符串。
后端
定义:将java对象转换成字节流序列(二进制)的过程。
为什么要序列化呢?(why)
前端
这个主要涉及到了对象的存储方式
。js有简单数据类型和引用数据类型。简单数据类型包括Number、String、Boolean、undefined、null、symbol。引用数据类型包括Object、function、array。
往往传递对象的时候需要序列化,因为它是引用数据类型。对象在存储的时候,存放它的地方是堆空间,而在内存中它只是个指针。举个例子:
let data = {"name":"test"}
{"name":"test"}
,这个它是我们要存的东西,它存放在堆中,比如它的门牌号(地址)是404。
data
,这个就是404,所以它并不是这个东西本身。也就是算一把钥匙吧。
如果我们直接将这个data传给后端,实际传过去的并不是数据本身-{"name":"test"}
,而是一个地址-404
。所以,序列化登场了。
它的作用就是将对象转换成字符串传过去!!!
这时,你们有没有这么一个问题,为什么字符串可以传过去啊,因为字符串它是简单数据类型,它在内存中存的什么就是什么。 所以它可以不用JSON.stringify()
。
实验
部分代码
// let data = {
let data = {
username:'test',
password:'test'
}
data = JSON.stringify(data)
// ajax调用
ajax('post', url, data)
const body = req.body
console.log(body)
后端接收到的,可以看到成功接收,如果注释掉data = JSON.stringify(data)
结果:接收不到了。
传递一个简单的数据类型呢?这里没有用JSON.stringify(data)
let data = 1
// ajax调用
ajax('post', url, data)
可以看到后端成功接收
所以。当我们如果传递一个简单数据类型的时候,就无需序列化
因为我本人研究后端,这里我就不详细说明序列号在后端的用途了。稍微提及一下吧。序列化在后端主要有以下两个用途。
- 将数据内容保存在磁盘上。
- 进行网络通信。