JavaScript 的序列化方法是将对象、数组或其他可序列化的值转换为字符串以进行存储或传输的过程。在 ES2021 中,一些新的序列化方法被引入,这些方法提供了更多的选项和性能优化。在本文中,我们将介绍这些新方法,并提供一些示例代码来说明它们的用法。
原有的序列化方法
在 ES5 中引入的 JSON.stringify()
方法是最常用的序列化方法。这个方法会将 JavaScript 对象转化为字符串,并将其存储或传输到另一个地方。序列化对象的方法非常便捷,而且很容易通过反序列化来将其还原成对象。
以下是 JSON.stringify()
的基本使用示例:
const person = { name: 'Alice', age: 25, hobbies: ['reading', 'painting'], pet: { type: 'cat', name: 'Fluffy' } }; const serialized = JSON.stringify(person); console.log(serialized); // 输出: {"name":"Alice","age":25,"hobbies":["reading","painting"],"pet":{"type":"cat","name":"Fluffy"}}
通过 JSON.parse()
,我们可以将字符串转换为 JavaScript 对象:
const deserialized = JSON.parse(serialized); console.log(deserialized); // 输出: { name: 'Alice', age: 25, hobbies: ['reading', 'painting'], pet: { type: 'cat', name: 'Fluffy' } }
新的序列化方法
在 ES2021 中引入了以下的新序列化方法:
StructuredClone.serialize()
:这个方法使用了浏览器内置的序列化算法,能够序列化更多的值类型,而不仅限于 JSON 格式所支持的值类型。Transferable Structured Clone
:这个是一项 WebSocket 标准,它提供了一种更快且更灵活的序列化方式,可以在不同的浏览器窗口之间传输对象。
在这篇文章中,我们将会重点关注 StructuredClone.serialize()
方法。
使用 StructuredClone.serialize()
序列化对象
StructuredClone.serialize()
方法使用自定义的算法,可以轻松地序列化包括函数、循环引用和一些原生对象(例如 Map
和 Set
)等值类型。以下是 StructuredClone.serialize()
的基础使用示例:
const person = { name: 'Alice', age: 25, hobbies: ['reading', 'painting'], pet: { type: 'cat', name: 'Fluffy', }, }; const serialized = StructuredClone.serialize(person); console.log(serialized); // 输出: ArrayBuffer { byteLength: 212 }
这里的 serialized
是一个 ArrayBuffer
类型的值,它仅仅是包含了序列化信息的一个二进制数据,为了转换成字符串,我们需要将它通过 TextDecoder
解码:
const decoder = new TextDecoder(); console.log(decoder.decode(serialized));
decoder.decode()
方法会解码 serialized
,得到以下输出:
{ "name": "Alice", "age": 25, "hobbies": [ "reading", "painting" ], "pet": { "type": "cat", "name": "Fluffy" } }
StructuredClone.serializeInto()
和 StructuredClone.deserialize()
方法
StructuredClone.serializeInto()
和 StructuredClone.deserialize()
方法引入了更多的选项,使得序列化和反序列化更加灵活。
StructuredClone.serializeInto()
方法可以将序列化信息保存到一个已有的 ArrayBuffer
中,并指定它的起始位置和总长度。
以下是 StructuredClone.serializeInto()
的使用示例:
const person = { name: 'Alice', age: 25, hobbies: ['reading', 'painting'], pet: { type: 'cat', name: 'Fluffy', }, }; const ab = new ArrayBuffer(1000); // 预分配一个长度为 1000 的 ArrayBuffer const serialized = StructuredClone.serializeInto(person, ab, 0, 500); // 将序列化信息存储到 ArrayBuffer 中, 从位置 0 开始,长度为 500 console.log(serialized); // 输出: ArrayBuffer { byteLength: 500 }
StructuredClone.deserialize()
方法用于将 ArrayBuffer 转换成 JavaScript 对象,并提供了对保存元数据的支持。
以下是 StructuredClone.deserialize()
的使用示例:
const ab = new ArrayBuffer(1000); // 预分配一个长度为 1000 的 ArrayBuffer const person = { name: 'Alice', age: 25, hobbies: ['reading', 'painting'], pet: { type: 'cat', name: 'Fluffy', }, }; StructuredClone.serializeInto(person, ab, 0, 500); // 将 person 序列化到 ArrayBuffer 中 const deserialized = StructuredClone.deserialize(ab, 0, 500); // 从位置 0 开始,长度为 500 反序列化 ArrayBuffer console.log(deserialized); // 输出:{ name: 'Alice', age: 25, hobbies: ['reading', 'painting'], pet: { type: 'cat', name: 'Fluffy' } }
总结
在 ES2021 中,JavaScript 序列化方法从 JSON.stringify()
扩展到了更为丰富和优化的形式。StructuredClone.serialize()
和相关方法使得更多元数据的保存和数据类型的序列化成为了可能。读者可以根据业务场景和自身需要选择适合自己的序列化方法。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65b02ca8add4f0e0ff994a30