Project Graph

开始使用

介绍

这个库可以把类的实例序列化成普通的对象,用在 Project Graph 项目的保存和加载。

并且提供了一些装饰器,可以轻松的标注哪些属性和方法需要被序列化,以及如何在反序列化时传入构造函数的参数。

安装

需要先在 tsconfig.json 中启用 experimentalDecoratorsemitDecoratorMetadata 选项。

npm install @graphif/serializer
# or use pnpm
pnpm add @graphif/serializer

用法

这是一个 Person

class Person {
  private isGreeting: boolean = false;

  constructor(
    public name: string,
    public age: number,
  ) {}

  greet() {
    this.isGreeting = true;
    console.log(`Hello, my name is ${this.name} and I am ${this.age} years old.`);
    this.isGreeting = false;
  }
}

我们想要把 nameage 序列化到对象中,但不包括 isGreeting

使用 @serializable 装饰器来标注这些属性为可序列化的。

由于技术原因,不能在构造函数的参数中使用 @serializable 装饰器。
import { serializable } from "@graphif/serializer";

class Person {
  @serializable
  public name: string;
  @serializable
  public age: number;

  private isGreeting: boolean = false;

  constructor(name: string, age: number) {
    this.name = name;
    this.age = age;
  }

  greet() {
    this.isGreeting = true;
    console.log(`Hello, my name is ${this.name} and I am ${this.age} years old.`);
    this.isGreeting = false;
  }
}

然后就可以序列化了

import { serialize } from "@graphif/serializer";

const person = new Person("Alice", 25);
const serialized = serialize(person);
console.log(serialized);

输出

{
  "_": "Person",
  "name": "Alice",
  "age": 25
}

你可以用 JSON.stringify 或者 MsgPack 保存到文件中

每个对象中都有一个 _ 字段,用来记录类的名称。

反序列化也很简单

import { deserialize } from "@graphif/serializer";

const deserialized = deserialize(serialized);
console.log(deserialized);

输出

Person { name: "Alice", age: 25 }

On this page