Angular 2(或 4)对象序列化

jar*_*smk 6 serialization typescript angular

最近遇到以下难题:

标准

打字稿文档建议用有下划线前缀的私有成员,允许getter / setter方法,利用该成员原来的“名”,间接提供公共接入(他们应该)创建对象的定义。

角文档另有建议,但是不提供使用的getter&setter方法在它们的对象定义例的专用变量的一个例子。

问题

我一直在很大程度上遵循 Typescript 编码标准。以下面的类为例:

public class Foo{
    private _bar:string;

    constructor(){ this._bar='Baz'; }

    get bar():string{return this._bar}
}
Run Code Online (Sandbox Code Playgroud)

使用以下代码将其序列化为 JSON:

console.log(JSON.stringify(new Foo()));
Run Code Online (Sandbox Code Playgroud)

...将产生:

{
    '_bar': 'Baz'
}
Run Code Online (Sandbox Code Playgroud)

问题

  1. 考虑到这些是“指南”和简单的建议,处理对象定义的 Angular 方式是什么,允许直接序列化?
  2. 在我的示例中,私有访问修饰符肯定不允许直接访问它的值吗?我在这里使用私有访问修饰符的理解中遗漏了什么?

我已经阅读了大量有关处理序列化的不同方式的其他文章和 StackOverflow 帖子,想要阻止“如何”,而是就所提到的行为询问“为什么”。

任何反馈将不胜感激!:)

亲切的问候

Gün*_*uer 7

您可以通过实现自定义序列化 toJSON()

public class Foo{
    private _bar:string;

    constructor(){ this._bar='Baz'; }

    get bar():string{return this._bar}

    toJSON() {
      return {bar: _bar};
    }

    static fromJSON(json) {
      ...
    }
}
Run Code Online (Sandbox Code Playgroud)

另见http://choly.ca/post/typescript-json/

Getter 和 setter 是纯 TypeScript 语言特性,与 Angular 完全无关。

private仅用于 TypeScript 中的静态分析。当它被转译为 JS 时private将不再存在。它变成了一个普通的旧 JS 对象并JSON.stringify像这样对待它。