序列化 #

Math.js 拥有许多数据类型,例如 MatrixComplexUnit。这些类型是实例化的 JavaScript 对象。为了能够存储这些数据类型或在进程之间发送它们,它们必须被序列化。Math.js 的数据类型可以序列化为 JSON。用例

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 的默认行为,该行为会使用 UnitComplex 等类的 .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))
}
Fork me on GitHub