Serialization(序列化)是一个有意思的问题,虽然在日常开发中已经听过或者使用过相关的技术,那如果说要解释一下什么是序列化?应该怎么回答,Object
转 String
?
在前端方面,最让人熟知的与序列化有关的的 Api 就是 JSON.stringify
,另一个 Api 则是 JSON.parse
。
序列化可以说是一个概念,并不是某个 Api,数据可以序列化为二进制、JSON String、XML。
为什么要 Serialization
序列化是将数据结构或对象状态转换为可以存储或传输的格式,反序列化则是将序列化后的格式还原为原始数据。从序列化的本质来看,主要是 存储
和 传输
。
传输方面,不同程序通信时,会发送各种类型的数据,包括文本、图片、音频、视频等,但网络传输时是通过二进制序列的形式传输。所以需要将原有数据序列化,然后在接收端恢复。
存储方面,不同的机器、执行环境,可能有不同的数据处理方式,可能导致反序列化时出现问题,所以也需要序列化。
类似协议、加密解密,按一个规则转为字符串或者字节序列,然后再按相反的规则转回来
Serialization 应用
以 JSON.stringify
为例子,我们不主要探讨这个 Api 的设计,主要看前端方面日常可能会用到的场景
- http,可能 BE 返回 JSON String,需要用
JSON.parse
进行解析或者需要 FE 在 POST 时将 JSON 用JSON.stringify
为 String 再 POST - Web Storage,存储到 Web Storage 的数据都需要转 String,因此也需要将数据序列化
- 深拷贝,用 JSON.stringify 和 JSON.parse 来做对象深拷贝,但这样性能并不好
- 去重、过滤、判断,这些相对有点黑科技并不提倡,而且只能使用比较简单的数据结构
JSON.stringify 可以把 Json 转为 String,但它也有比较多的限制,如 undefined 、Date()、symbol 等都处理不好
Perception
扩展 JSON.stringify,目前的 undefined 会忽略,Date、Symbol 等无法正确处理,需要一个新的 Api,可以更好的包含现在有 Javascript 新的数据类型。
可以用来做 SSR 的状态传输,服务端中将数据或者状态进行序列化,然后在前端进行反序列化,现有的前端框架是否能使用这个思路去处理和解决部份的状态统一。
前端是否可以更进一步,不单单是 JSON 的序列化为 String,而是序列化为二进制或者字节,然后通过用 Stream 来进行传输或者 Lazy deserialization。