2012-06-30 59 views
7

我看到如何寫對象到文件中,如下所述:How can I save objects to files in Node.js?但是有沒有一種方法來獲取對象並以允許我將對象重新加載到內存中的方式編寫對象,包括其方法?將js對象寫入nodejs中的文件(包括方法)?

+2

書寫和閱讀功能給注射帶來巨大風險。我會考慮這個決定的安全影響。 –

+0

我同意安東尼。但是,如果你真的需要它,你可以簡單地保存JavaScript代碼,然後加載它並調用'eval'。 – freakish

+0

我同意安全問題。我只是在玩一個想法。謝謝! – luisgo

回答

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)) 
+3

O_O你爲什麼要重新發明輪子?定義對象自定義序列化的'toJSON'方法,例如。 ' .prototype.toJSON'。爲了獲得更大的靈活性,請定義[JSON.stringify'的替代品](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/JSON/stringify#Syntax)。 –

+0

@RobW不知道這些。非常有用,謝謝! – Trevor

+0

非常有用。謝謝! – luisgo

0

我最近寫shovejs:http://shovemedia.github.com/shovejs/處理正是這樣的事情。 YMMV - 我還沒有用Node試過它。

它將類型化的對象結構轉換爲JSON(然後將其保存到磁盤),並可將該結構充氣回類型化對象,包括正確的對象 - >對象引用等。爲了清楚起見,方法/類定義本身不是序列化的。系統只是期望在序列化期間可用的已註冊模型/工廠類在反序列化期間也可用。

事先道歉沒有發佈一些簡單的例子。

編輯:該技術是各式的採取什麼羅布W¯¯提到以下

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但是代碼非常簡單,大家理解。

+0

小心使用'evalFunctions:true'選項,因爲它將允許JavaScript執行(請參閱https://gist.github.com/DinisCruz/245716893d783ea740ea) –