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

Javascript 将js对象写入nodejs中的文件(包括方法)?,javascript,node.js,Javascript,Node.js,我明白了如何将对象写入此处所述的文件:但有没有一种方法可以将对象写入内存,包括其方法?正如@AnthonySottile之前所说,这可能非常危险,我不确定是否有好的使用案例,但是,仅仅为了好玩,您需要编写自己的递归序列化程序。大概是这样的: var toString = Object.prototype.toString; function dump_object(obj) { var buff, prop; buff = []; for (prop in obj) {

我明白了如何将对象写入此处所述的文件:但有没有一种方法可以将对象写入内存,包括其方法?

正如@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();
}
我最近写了一篇文章:来处理这类事情。YMMV——我还没有用Node试过

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

为没有张贴一些简单的例子提前道歉


编辑:这项技术是对Rob W在下面的评论中提到的内容的一种强化。

这个问题已经很老了,但我在JavaScript中找不到有效序列化问题的简单解决方案。
可以使用(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

确实如此,但代码非常简单,每个人都能理解。

编写和读取函数会带来巨大的注入风险。我会考虑这个决定的安全含义。我同意安东尼的观点。但是,如果您真的需要它,您只需保存JavaScript代码,然后加载它并调用
eval
,我同意安全方面的考虑。我只是在玩弄一个主意。谢谢你为什么要发明轮子?定义对象自定义序列化的
toJSON
方法,例如
.prototype.toJSON
。要获得更大的灵活性,请定义一个。@RobW不知道这两个。非常有用,谢谢!dump_to_string“'s的替换函数必须是全局的,例如:obj.replace(/\“/g,\\\”)提供了一个编辑,但我认为它可能被拒绝,dunno:)同意@JayLink,
obj.replace
应该使用
/“/g
来确保所有
正确更换,不仅仅是第一个。这个答案已经给出4年了,但它救了我!你让我开心!非常感谢你!!!小心使用“evalFunctions:true”选项,因为它将允许javascript执行(请参阅)
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