将js对象写入nodejs中的文件(包括方法)?

时间:2012-06-30 16:29:57

标签: javascript node.js

我看到如何将对象写入文件,如下所述:How can I save objects to files in Node.js?但是有没有办法获取对象并以允许我将对象重新加载到内存中的方式编写它,包括其方法? / p>

3 个答案:

答案 0 :(得分:6)

正如@AnthonySottile之前所说的那样,这可能是非常危险的,我不确定它是否有一个很好的用例,但只是为了踢和咯咯,你需要编写自己的递归序列化器。像这样:

var toString = Object.prototype.toString;

function dump_object(obj) {
    var buff, prop;
    buff = [];
    for (prop in obj) {
        buff.push(dump_to_string(prop) + ': ' + dump_to_string(obj[prop]))
    }
    return '{' + buff.join(', ') + '}';
}

function dump_array(arr) {
    var buff, i, len;
    buff = [];
    for (i=0, len=arr.length; i<len; i++) {
        buff.push(dump_to_string(arr[i]));
    }
    return '[' + buff.join(', ') + ']';
}

function dump_to_string(obj) {
    if (toString.call(obj) == '[object Function]') {
        return obj.toString();
    } else if (toString.call(obj) == '[object Array]') {
        return dump_array(obj);
    } else if (toString.call(obj) == '[object String]') {
        return '"' + obj.replace('"', '\\"') + '"';
    } else if (obj === Object(obj)) {
        return dump_object(obj);
    }
    return obj.toString();
}

这将处理大多数类型,但总是有一个奇怪的东西弄乱它,所以我不会在生产中使用它。之后反序列化非常简单:

eval('var test = ' + dump_to_string(obj))

答案 1 :(得分:1)

这个问题已经过时了,但我无法找到解决JavaScript中有效序列化问题的简单解决方案。
可以使用BSON(MongoDB内部对象表示),它使用二进制格式来表示内存中的对象。

我找不到文档的链接,但code is well documented和我提出了类似的内容:

fs = require 'fs'
bson = require('bson').BSONPure.BSON

obj = {
  string: "test",
  func: (s) ->
    console.log s
}

fs.writeFile 'test.txt', bson.serialize(obj, false, false, true), (err) ->
  return console.log("Err : #{err}") if err
  fs.readFile 'test.txt', (err, file) ->
    return console.log("Err : #{err}") if err
    deserialized = bson.deserialize file, evalFunctions: true
    deserialized.func deserialized.string // Outputs 'text', as expected

它是coffee-script,但代码很简单,每个人都可以理解。

答案 2 :(得分:0)

我最近写了shovejs:http://shovemedia.github.com/shovejs/来处理这类事情。 YMMV - 我还没有尝试过Node。

它将类型化的对象结构转换为JSON(然后将其保存到磁盘),并将该结构扩展回包含适当对象的类型对象 - &gt;对象引用等。为了清楚起见,方法/类定义本身不是序列化的。系统只是期望序列化期间可用的已注册Model / Factory类在反序列化期间也可用。

事先道歉没有发布一些简单的例子。

编辑:这项技巧是对Rob W在下面的评论中提到的内容的加强看法