You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript如何存储还原对象并保留所有类型元数据与隐藏属性?

问题描述

我正在寻找一种存储并检索对象的方法,以保留其所有类型信息与元数据(描述符、属性等)。目前找到的方案均在加密前使用JSON.stringify(或其变体),但该方法仅保留结构与原始类型值。我希望待处理的对象无需装饰器或特定解析器,能够处理任意对象。

编辑1: 我不局限于加密或序列化方案,只要能实现即可。目标是让Util.inspect在序列化/加密前后生成完全相同的字符串,其配置参数如下:

{
  showHidden: true,
  depth: Infinity,
  colors: true,
  breakLength: Infinity,
  compact: true
}

编辑2: 对于简单对象,JSON.stringify → JSON.parse完全可行,但像http模块的IncomingMessage这类复杂对象会丢失大量信息(如隐藏属性)。

解决方案建议
  • 优先用Node.js原生v8.serialize()/v8.deserialize():这俩是V8引擎自带的序列化工具,能完整留存对象的所有类型信息、隐藏属性、元数据甚至原型链,包括IncomingMessage这类复杂内置对象。用法直接:

    const v8 = require('v8');
    const util = require('util');
    
    // 序列化复杂对象
    const serialized = v8.serialize(yourIncomingMessage);
    // 存储/传输这个Buffer(可转base64存文本)
    // 反序列化还原
    const restored = v8.deserialize(serialized);
    
    // 验证:前后inspect输出完全一致
    console.log(util.inspect(yourIncomingMessage, {
      showHidden: true,
      depth: Infinity,
      colors: true,
      breakLength: Infinity,
      compact: true
    }));
    console.log(util.inspect(restored, {
      showHidden: true,
      depth: Infinity,
      colors: true,
      breakLength: Infinity,
      compact: true
    }));
    

    全程不需要装饰器或自定义解析器,纯原生支持。

  • 注意点:这个方案是Node.js专属的,若要跨浏览器环境不适用。序列化结果是二进制Buffer,存储时可直接写二进制文件,或者转成base64字符串存文本格式。

  • 备选方案(不推荐,不符合无解析器要求):手动遍历对象所有属性(用Object.getOwnPropertyDescriptors())+ 保存原型链(Object.getPrototypeOf()),自己实现序列化逻辑,但需要配套写反序列化代码,不符合你“无需特定解析器”的需求,所以优先选v8模块方案。

内容的提问来源于stack exchange,提问作者his dudeness

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 17:05:05