在 JavaScript 中序列化/反序列化对象的最佳方法?

2023-12-12

我的应用程序中有许多 JavaScript 对象,例如:

function Person(age) {
    this.age = age;
    this.isOld = function (){
        return this.age > 60;
    }
}
// before serialize, ok
var p1 = new Person(77);
alert("Is old: " + p1.isOld());

// after, got error Object #<Object> has no method 'isOld'
var serialize = JSON.stringify(p1);
var _p1 = JSON.parse(serialize);
alert("Is old: " + _p1.isOld());

See in JSFiddle.

我的问题是:是否有最佳实践/模式/提示来恢复序列化之前相同类型的对象(在本例中为 Person 类的实例)?

我的要求:

  • 优化磁盘使用:我在内存中有一个很大的对象树。所以,我不想存储函数。
  • 解决方案可以使用 jQuery 和另一个库来序列化/反序列化。

JSON 没有数据类型的功能。您只能序列化字符串、数字、对象、数组和布尔值(以及null)

您可以创建自己的toJson方法,只传递真正需要序列化的数据:

Person.prototype.toJson = function() {
    return JSON.stringify({age: this.age});
};

与反序列化类似:

Person.fromJson = function(json) {
    var data = JSON.parse(json); // Parsing the json string.
    return new Person(data.age);
};

用法是:

var serialize = p1.toJson();
var _p1 = Person.fromJson(serialize);
alert("Is old: " + _p1.isOld());

为了减少工作量,您可以考虑将每个需要序列化的所有数据存储在一个特殊的“data”属性中Person实例。例如:

function Person(age) {
    this.data = {
        age: age
    };
    this.isOld = function (){
        return this.data.age > 60 ? true : false;
    }
}

那么序列化和反序列化只是调用JSON.stringify(this.data)并设置实例的数据将是instance.data = JSON.parse(json).

这将保持toJson and fromJson方法很简单,但你必须调整你的其他功能。


边注:

您应该添加isOld函数原型的方法:

Person.prototype.isOld = function() {}

否则,每个实例都有它自己的该函数的实例,这也会增加内存。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 JavaScript 中序列化/反序列化对象的最佳方法? 的相关文章