在 ES2021 中使用 JavaScript 的序列化方法!

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() 方法使用自定义的算法,可以轻松地序列化包括函数、循环引用和一些原生对象(例如 MapSet)等值类型。以下是 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,得到以下输出:

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