【问题标题】:writing js objects to files (including methods) in nodejs?在nodejs中将js对象写入文件(包括方法)?
【发布时间】:2012-06-30 16:29:56
【问题描述】:

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

【问题讨论】:

  • 写入和读取函数存在巨大的注入风险。我会考虑这个决定的安全影响。
  • 我同意安东尼的观点。不过,如果你真的需要它,你可以简单地保存 JavaScript 代码,然后加载它并在上面调用eval
  • 我同意安全问题。我只是在玩一个想法。谢谢!

标签: javascript node.js


【解决方案1】:

正如@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))

【讨论】:

  • O_O 你为什么要重新发明轮子?为对象的自定义序列化定义toJSON 方法,例如。 &lt;SomeObject&gt;.prototype.toJSON。要获得更大的灵活性,请定义 replacer for JSON.stringify
  • @RobW 不知道其中任何一个。很有用,谢谢!
  • dump_to_string "的替换函数必须是全局的,例如:obj.replace(/\"/g, '\\"') 提供了一个编辑,但我认为它可能被拒绝了,不知道:)
  • 同意@jaywink,obj.replace 应该使用/"/g 以确保正确替换所有",而不仅仅是第一个。
  • 这个答案已经4年了,但它救了我!你让我今天一整天都感觉很好!非常感谢!!!
【解决方案2】:

这个问题已经很老了,但是我在任何地方都找不到一些简单的解决方案来解决 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,但代码很简单,每个人都能理解。

【讨论】:

【解决方案3】:

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

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

对于没有发布一些简单的示例提前道歉。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-20
    • 2016-02-29
    • 1970-01-01
    • 1970-01-01
    • 2011-12-27
    • 2018-09-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多