序列化 #
Math.js 拥有许多数据类型,例如 Matrix、Complex 和 Unit。这些类型是实例化的 JavaScript 对象。为了能够存储这些数据类型或在进程之间发送它们,它们必须被序列化。Math.js 的数据类型可以序列化为 JSON。用例
- 将数据存储在数据库或磁盘上。
- 在服务器和客户端之间交换数据。
- 在 Web Worker 和浏览器之间交换数据。
Math.js 类型可以使用 JavaScript 内置的 JSON.stringify 函数进行序列化。
const x = math.complex('2 + 3i')
const str = JSON.stringify(x, math.replacer)
console.log(str)
// outputs a string '{"mathjs":"Complex","re":2,"im":3}'
重要提示:在大多数情况下,无需将
math.replacer函数作为第二个参数传递,序列化也能正常工作。这是因为在大多数情况下,我们可以依赖 JSON.stringify 的默认行为,该行为会使用Unit和Complex等类的.toJSON方法来正确序列化它们。但是,存在少数特殊情况,例如数字Infinity,它需要 replacer 函数才能在不丢失信息的情况下进行序列化:没有它,Infinity将被序列化为"null",并且无法正确反序列化。因此,最好始终传递
math.replacer函数以防止出现奇怪的边缘情况。
为了反序列化包含 math.js 数据类型的字符串,可以使用 JSON.parse。为了识别 math.js 的数据类型,必须使用 math.js 的 reviver 函数调用 JSON.parse。
const json = '{"mathjs":"Unit","value":5,"unit":"cm","fixPrefix":false}'
const x = JSON.parse(json, math.reviver) // Unit 5 cm
请注意,如果 math.js 与其他数据类型结合使用,可以通过级联来同时使用多个 reviver 函数。
const reviver = function (key, value) {
return reviver1(key, reviver2(key, value))
}