首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在类型记录中序列化/反序列化复杂对象,例如反序列化对象与序列化对象的类型相同

如何在类型记录中序列化/反序列化复杂对象,例如反序列化对象与序列化对象的类型相同
EN

Stack Overflow用户
提问于 2019-08-02 20:55:26
回答 2查看 682关注 0票数 0

我有一个复杂的对象,我想要序列化和反序列化,并获得一个相同类型的对象。

代码语言:javascript
复制
let workflow = new Workflow();
console.log(`workflow is instanceof Workflow: ${workflow instanceof Workflow}`);
console.log(workflow);

let json = JSON.stringify(workflow);
console.log(json);

let workflow2 = JSON.parse(json) as Workflow;
console.log(workflow2);
console.log(`workflow2 is instanceof Workflow: ${workflow2 instanceof Workflow}`);

let workflow3: Workflow = JSON.parse(json) as Workflow;
console.log(workflow3);
console.log(`workflow3 is instanceof Workflow: ${workflow3 instanceof Workflow}`);

控制台输出是:

是否有开箱即用的解决方案?还是我需要手动恢复复杂对象并设置其所有属性?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-08-03 14:15:02

您可以使用对象的fromJSON()reviver函数来实现您想要的JSON.parse()

例如:

代码语言:javascript
复制
type Serialized<T> = Pick<T, keyof T> & { _type: string };

class Workflow {
  foo: number;

  constructor(foo: number) {
    this.foo = foo;
  }

  public toJSON(): Serialized<Workflow> {
    return {
      _type: this.constructor.name,
      ...this
    };
  }

  public static fromJSON(source: Serialized<Workflow>): Workflow {
    return new Workflow(source.foo);
  }
}

function reviver(key: string, value: any): any {
  if (typeof value === "object" && value && "_type" in value) {
    switch (value._type) {
      case "Workflow": return Workflow.fromJSON(value);
    }
  }
  return value;
}

const w = new Workflow(42);
console.log(w instanceof Workflow);

const s = JSON.stringify(w);
console.log(s);

const w2 = JSON.parse(s, reviver) as Workflow;
console.log(w2.foo);
console.log(w2 instanceof Workflow);

指纹:

代码语言:javascript
复制
true
{"_type":"Workflow","foo":42}
42
true

你自己在游乐场试试吧!

票数 3
EN

Stack Overflow用户

发布于 2021-09-08 00:56:38

有没有现成的解决方案.

我制作了一个名为串联器的npm模块来解决这个问题:在序列化过程中以普通的JSON格式保存JavaScript/TypeScript类实例,以及它的类名信息:

代码语言:javascript
复制
const ESSerializer = require('esserializer');

class Workflow {
  foo:number;
  constructor(foo:number) {
    this.foo = foo;
  }
}

const w = new Workflow(42);
console.log(w instanceof Workflow);

const s = ESSerializer.serialize(w);
console.log(s);

稍后,在反序列化阶段(可能是在另一台机器上),esserializer可以递归地反序列化对象实例,并保留所有Class/Property/Method信息,使用相同的类定义:

代码语言:javascript
复制
const o = ESSerializer.deserialize(s, [Workflow]);
console.log(o.foo); // 42
console.log(o instanceof Workflow); // true
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57333334

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档