如何在JavaScript中序列化对象?

Bdf*_*dfy 9 javascript node.js

例如我有课:

function Test() {
}

Test.prototype = {
    'setTest' : function(test) {
        this.test = test;
    }
}
var test = new Test();
Test.setTest('test');
Run Code Online (Sandbox Code Playgroud)

我想在数据库中保存对象测试.如何将对象测试序列化为字符串?(方法,变量等)

小智 11

简单用json

JSON.stringify( test );
Run Code Online (Sandbox Code Playgroud)

  • JSON.stringify()不会序列化方法. (37认同)

jco*_*and 8

在这种情况下,对于你问的问题,真的没有办法做你想做的事.您的请求的问题在于"序列化附加到对象的所有内容,包括函数".

序列化通常仅针对数据发生,因为可执行文件通常是机器绑定的,因为它们是基于某些特征针对给定机器编译的.现在,有理由说javascript函数只需要一个javascript解释器,因为javascript是一次性写入,无处不在.但是当人们编写序列化程序时,因为所有序列化程序的工作方式都相同,所以我们只为数据编写它们.在这种情况下,行业标准是JSON,它是一个仅限对象数据的序列化程序.

此时有三种解决方案可供您使用:

  1. 编写自己的封装函数的serialier/deserializer.这可能很棘手,因为并非所有的javascript引擎都能让您访问源代码.
  2. 编写自己的重新加载机制,在每次还原时生成特定的新初始化类型,并将类型名称保存为序列化中的一个属性.这样,每个变量的初始化为您提供了方法,然后与数据合并为您提供了完整的对象.
  3. 将每个函数存储为字符串,并根据需要随时进行评估.这非常棘手,很容易出错.我认为这不会有任何帮助,因为它非常脆弱.但是,它是一种选择,不容忽视.

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

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

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

因此,您当然可以将方法序列化为字符串来代替实际方法,但是您需要创建一个重复的对象,以便捕获源对象上的每个元素(我认为,而不是替换它们).

希望这可以帮助您更多地思考问题,并且可能意识到您不需要序列化方法(没有人做过我所知道的,不合理的).

  • 对上下文的闭包使这变得更加困难:如果“事物”是一个本地 var 而不是参数,并且 abc 被返回到一个不再有事物的外部作用域。 (2认同)

Mat*_*all 2

通常,您可以使用JSON来完成此操作,它在浏览器/语言/库/等方面得到广泛支持。唯一的问题是 JSON 不支持函数 \xe2\x80\x93 但你真的需要序列化这些函数吗?

\n