如何在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可供您使用:
- 编写你自己的封装函数的串行/解串器。 这可能会很棘手,因为不是所有的JavaScript引擎都会让你访问源代码。
- 编写您自己的重新加载机制,在每次还原时生成特定的新的初始化types,并将types名称保存为序列化中的一个属性。 这样每个variables的初始化给你的方法,然后与数据合并给你完整的对象。
- 将每个函数存储为一个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。
- node.js中的信号量 – 使用计数器variables
- 无法将Node应用程序部署到Openshift
- node.js使代码等待,直到fs.readFile完成
- 什么是安装selenium-webdriver与NodeJS + Selenium + Mocha(在Windows上)的理想位置?
- 如何找出javascript中Object和Strings的字节大小来分析数据的效率
- 如何将res从一个函数传递给另一个?
- javascript的范围问题(node.js + mongo.db)
- 加载资源失败:运行SHOW路由后,服务器的响应状态为404(Not Found)
- ECMAScript 6function在Node.js 0.12中可用