如何在JavaScript中序列化一个对象?

比如我有课:

function Test() { } Test.prototype = { 'setTest' : function(test) { this.test = test; } } var test = new Test(); Test.setTest('test'); 

我想在数据库中保存对象testing。 如何将对象testing序列化为string? (方法,variables等)

与json简单

 JSON.stringify( test ); 

在这种情况下,对于你所问的问题,真的没有办法做到你想要的。 您的请求的问题在于“序列化连接到对象的所有东西,包括函数”。

序列化通常只发生在数据上,因为可执行文件通常是机器绑定的,因为它们是根据特定的特性为给定的机器编译的。 现在,说javascript函数只需要一个javascript解释器是合理的,因为javascript是一次写入,随处运行的。 但是当人们编写串行器时,因为所有的串行器都倾向于工作,所以我们只写数据。 在这种情况下,行业标准是JSON,这是一个对象数据唯一的串行器。

目前有三种解决scheme可供您使用:

  1. 编写你自己的封装函数的串行/解串器。 这可能会很棘手,因为不是所有的JavaScript引擎都会让你访问源代码。
  2. 编写您自己的重新加载机制,在每次还原时生成特定的新的初始化types,并将types名称保存为序列化中的一个属性。 这样每个variables的初始化给你的方法,然后与数据合并给你完整的对象。
  3. 将每个函数存储为一个string,并根据需要随时对其进行评估。 这是非常棘手的,很容易出错。 我可以想到这种情况不会有帮助,因为它很脆弱。 但是,这是一个select,不容忽视。

我知道3是1的子答案,所以你可以认为只有两个有用的答案。

我知道,这表面上适用于Chrome和IE9,所以它应该在大多数用户可能使用它的地方工作:

 var abc = function(thing) { return thing; } abc.toString(); // gives "function(thing) { return thing; }" on the command line 

所以你可以将方法当作string来代替实际的方法,但是你需要创build一个重复的对象,以便捕获源对象上的每个元素(我认为,而不是replace它们)。

希望这可以帮助你更多地思考这个问题,也许意识到你不需要序列化这些方法(我从来没有人知道这个方法是不合理的)。

最好的方法是编写一个自己的序列化方法,根据你的getters创build一个带有属性的JSON对象。 通常你定义一个getter per属性。 所以它应该适用于大多数情况(所以你不必为每个类定义一个序列化方法)

 function serialize(obj) { var serialized = {}; for(var prop in obj) { if (obj.hasOwnProperty(prop) && typeof obj[prop] == 'function') { if (/^get.*/.test(prop)) { var value = obj[prop](); var name = prop.replace('get', ''); if (typeof value === 'object')) { serialized[name] = this.serialize(value); continue; } serialized[name] = value; } } } return serialized; }; 

要将您的属性值重新设置为类,您有两个选项:

  • 在你的类中创build一个基于序列化的JSON创build一个有效的对象实例的函数。
  • 创build一个反序列化方法,并使用setter将JSON与您的类进行映射。

例:

 function unserialize(obj, emptyClass) { // check emptyClass for setters and map the data from obj to it return 'class instance'; } 

通常情况下,您可以使用JSON来实现这一点, JSON在浏览器/语言/库/等方面得到了广泛的支持。 唯一的困扰是JSON不支持函数 – 但是你真的需要序列化这些吗?

我不得不支持之前类似的function。 我最终将函数的名称保存为一个string,并将其序列化为JSON。 然后,当我回到客户端,我使用一个助手,如在这个问题上发布的帮助者执行该function。

如果有人有更好的方法来解决这个问题,我想看看!

我最近不得不为这个问题find一个解决scheme。 我相信它可以改进。

首先我创build了一个实例化“serialisable”对象的模块。

 function MyObj(serialised){ this.val = ""; if(serialised){ var unserialised = JSON.parse(serialised); for (var i in unserialised) { this[i] = unserialised[i]; } } } MyObj.prototype.myMethod = function () { return this.val;}; module.exports = MyObj; 

您当然必须考虑error handling和其他validation。