9

我看到了如何将对象写入文件,如下所述:如何将对象保存到 Node.js 中的文件?但是有没有办法获取一个对象并以一种允许我将对象重新加载到内存中的方式写入它,包括它的方法?

4

3 回答 3

7

正如@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))
于 2012-06-30T17:42:44.897 回答
2

这个问题很老了,但我在任何地方都找不到一些简单的解决方案来解决 JavaScript 中有效序列化的问题。
可以使用BSON(MongoDB 内部对象表示),它使用二进制格式来表示内存中的对象。

我找不到文档的链接,但代码有据可查,我想出了这样的东西:

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

它是咖啡脚本,但代码很简单,每个人都能理解。

于 2014-06-22T05:58:16.520 回答
0

我最近写了 shoveJS:https ://shovemedia.github.io/shovejs/来处理这类事情。YMMV——我还没有在 Node 上尝试过。

它将类型化对象结构转换为 JSON(然后将其保存到磁盘),并且可以将该结构膨胀回类型化对象,包括正确的对象 -> 对象引用等。要清楚,方法/类定义本身不是序列化的。系统只是期望在序列化期间可用的已注册模型/工厂类在反序列化期间也可用。

提前道歉没有发布一些简单的例子。

编辑:该技术是对 Rob W 在下面的评论中提到的内容的改进

于 2012-06-30T18:01:22.260 回答