写这篇文章的起因是项目中遇到一个问题,然后引发了我对序列化一系列的思考。
整件事情
如果你的后端小伙伴写了一个get请求类型的接口,但是请求的参数中包含了一个数组。例如:bottomTab[1,2]
于是乎......
①、假设你的项目使用aixos这个HTTP 库发送请求。
②、假设你的项目没有使用qs这种插件、并且对get请求的参数进行序列化操作。
那么......
那么将会报错,打开控制台会发现参数是如下这样被拼接到请求地址后面的:
http://localhost:8014/ehuzhu/index/chart?bottomTab[]=1&bottomTab[]=2&......
后端是解析不了的,预期的结果是如下这样:
http://localhost:8014/ehuzhu/index/chart?bottomTab=1&bottomTab=2&......
解决办法:
//在aixos实例的请求拦截里面
import qs from 'qs'
......
//利用qs插件对get方式请求的参数进行序列化
if ( config.method === 'get' ) {
config.paramsSerializer = function (params) {
return qs.stringify(params, { arrayFormat: 'repeat' })
}
}
关于qs这个插件的使用,自行百度一下去看文档即可。
那么具体问题是解决了,事情本应该到此结束了。但是本人还是存在很多很多问题,特别是对于序列化这个词是一点概念也没有。
存在问题
①什么是序列化?
序列化和反序列化-美团技术团队,显然看懂这篇文章需要专业的知识,遗憾的是本人目前并没有这种储备。因此,以下叙述都是本人自己理解。
1、序列化: 将数据结构或对象转换成二进制串的过程。
2、不同的计算机语言中,数据结构,对象以及二进制串的表示方式并不相同。
3、序列化所生成的二进制串指的是存储在内存中的一块数据。
以上三点是美团技术团队文章中的描述,那么按文章中举的例子来理解。
Java语言的二进制串指的是byte[],byte是Java的8中原生数据类型之一。
C++语言的二进制串指C++语言的字符串、因为C++语言的字符串可以直接被传输层使用。
那么前端使用的JavaScript语言呢?
MDN上关于序列化(Serialization)的描述中提到,在 JavaScript 中,你可以通过调用JSON.stringify()函数将某个值序列化为JSON格式的字符串。
那么对应的JavaScript语言中的二进制串就是上述提到的JSON格式的字符串?JSON格式的字符串是内存中的一块数据吗?
我目前的知识储备来说,还无法下这个定论。
②为什么要序列化?
1、互联网的产生带来了机器间通讯的需求,而互联通讯的双方需要采用约定的协议。
2、序列化和反序列化属于通讯协议的一部分。
3、序列化协议属于TCP/IP协议应用层的一部分。(序列化协议:XML、JSON......)
以上三点是美团技术团队文章中的描述,已经回解决了大部分疑问。
over......