Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
3.7k views
in Technique[技术] by (71.8m points)

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

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

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

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

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

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


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

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

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

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

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

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

我们可以编码为:

name:justjavac

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

以上。


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...