Angular 2(或 4)对象序列化

标签 angular typescript serialization

最近遇到以下难题:

标准

Typescript documentation建议使用带有下划线前缀的私有(private)成员创建对象定义,允许 getter/setter 使用所述成员的原始“名称”,提供间接公共(public)访问(他们应该这样做)。

Angular documentation否则建议,但是没有提供在其对象定义示例中对私有(private)变量使用 getter 和 setter 的示例。

问题

我一直在最大限度地遵循 Typescript 编码标准。以下面的类为例:

public class Foo{
    private _bar:string;

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

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

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

console.log(JSON.stringify(new Foo()));

...将产生:

{
    '_bar': 'Baz'
}

问题

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

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

如有任何反馈,我们将不胜感激! :)

亲切的问候

最佳答案

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

public class Foo{
    private _bar:string;

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

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

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

    static fromJSON(json) {
      ...
    }
}

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

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

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

关于Angular 2(或 4)对象序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44407491/

相关文章:

c# - 当它们不 "shaped"相同时,将 XML 反序列化为对象?

java - 如何使用循环引用进行 json 处理?

html - Angular 4 | app.component.html 内容未显示

html - 如何在使用页面 anchor 导航时将 "activate"类设置为在 Angular 2 中 Bootstrap 导航栏?

typescript - 在客户端和服务器之间共享类型

html - Angular - 防止禁用按钮上的点击事件

python - 序列化程序不从查询集中写入单个对象

google-maps - angular2-google-maps 导致 ctorParameters.map 错误

javascript - 我如何在我的 Angular 项目中使用此jquery函数

javascript - Angular2 FileSaver.js