问一个网络传输和序列化问题!

狂人的芝士
  • 111

最近用axios发现了序列化这三个字,很好奇,上网搜了下出现什么编码,字节,二进制数据流,直接懵了。

什么是序列化,为什么需要序列化?

content-type和序列化有啥关系吗?

当content-type为form-url-encoded的时候,我看数据格式是用&符号连接的,这种格式的数据和json一样也是字符串吗?

基础不太好,求大佬指教了!

回复
阅读 767
2 个回答
✓ 已被采纳

序列化(Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程,对应的则是反序列化的过程,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。

content-type 表示数据以什么样的方式进行编码。比如需要传递一个对象 User,这个对象有 2 个 key 和 2 个 value。

let user = {
  "name": "justjavac",
  "age": 18
}

在内存中这个对象不仅仅只有这 2 个属性,还有原型链以及其他一些对象的状态信息和内存布局信息。然而我们只需要传输或者存储这 2 个信息,也就是说我们要对 User 的这 2 个属性进行序列化。

而编码就涉及到,我们如何将这个对象通过网络进行传输,为了确保接收方(服务器)能够正确的解码这个对象,我们不仅仅要发送序列化的字符串,还要发送 content-type,告知对方以何种方式进行解码。

我们可以编码为:

name:justjavac\n
age:18

或者

name=justjavac&age=18

或者

name:justjavac;age=18

服务器接收到数据后,再根据 content-type 的编码类型进行解码。

浏览器和服务器只支持第二种,这种方式的优势是发送的数据量少,缺点是没有类型信息。服务器接收到数据后,根据约定转化为对应的类型(此类型不必和前端 js 一一对应)。

另一种编码就是 json,发送数据为:

{"name":"justjavac","age":18}

这种方式包含了类型信息。

此外 http 还支持另外的 2 中编码方式(共4种)。

此外,如果你的业务涉及到加密或者更优秀的编码方式,也可以使用 raw 方式传递原始字符串数据,然后前后端约定编码/解码算法。

比如传递

u^3hpo)4hAU

以上。

序列化与反序列化 是数据存储、传输中常见的概念。
需要知道 数据存储和传输中受一些限制,很多时候并不能直接保存内存中的一些数据(包括数据结构),这时,把内存中的 数据 转换为 一种适合传输存储的 数据格式(数据流、数据报......)就称为 内存数据的序列化, 再把这样的数据 恢复为内存中 相应程序可以直接使用的数据过程 就称为 反序列化。

实际上这样 是一种数据 从内存数据 传输数据(存储数据)的一种处理机制,没有完全统一的标准,在不同的处理中可以表现为不同的实现,比如不同的传输协议、存储数据组织等等。

一般在http传输领域,因为可能传输处理的内容格式太丰富了,就约定了常见的一些数据内容 传输中的 标识,它就反映为 content-type,它涉及了数据主体内容大致数据类型,对文本类数据还可以明确编码体系。

form-url-encoded估计是form-urlencoded的误写,它一般表明传输中的涉及表单URL信息是经过再编码处理的,具体可以参考application/x-www-form-urlencoded,它指URL信息中非ANSCII字符是编码过的。

你知道吗?

宣传栏