gpt4 book ai didi

javascript - 在 JavaScript 中序列化/反序列化对象的最佳方式?

转载 作者:IT王子 更新时间:2023-10-29 02:59:06 26 4
gpt4 key购买 nike

我的应用程序中有很多 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());

参见JS Fiddle .

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

我的要求:

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

最佳答案

JSON 没有数据类型的功能。您只能序列化字符串、数字、对象、数组和 bool 值(和 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());

为了减少工作量,您可以考虑将所有需要序列化的数据存储在每个 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).

这将使 toJsonfromJson 方法保持简单,但您必须调整其他函数。


旁注:

您应该将 isOld 方法添加到函数的原型(prototype)中:

Person.prototype.isOld = function() {}

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

关于javascript - 在 JavaScript 中序列化/反序列化对象的最佳方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6487699/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com