2012-06-30 14 views
7

Vedo come posso scrivere oggetti su file come descritto qui: How can I save objects to files in Node.js? ma c'è un modo per prendere un oggetto e scriverlo in un modo che mi permetta di ricaricare l'oggetto in memoria compresi i suoi metodi?scrivendo oggetti js su file (compresi i metodi) in nodejs?

+2

Le funzioni di scrittura e lettura presentano un enorme rischio di iniezione. Prenderò in considerazione le implicazioni di sicurezza di questa decisione. –

+0

Sono d'accordo con Anthony. Se proprio ne hai bisogno, però, puoi semplicemente salvare il codice JavaScript, quindi caricarlo e chiamare 'eval' su di esso. – freakish

+0

Sono d'accordo sui problemi di sicurezza. Sto solo giocando con un'idea. Grazie! – luisgo

risposta

6

Come detto in precedenza da @AnthonySottile, questo può essere estremamente pericoloso e non sono sicuro che ci sia sempre un buon caso per l'uso, ma solo per i calci e le risatine bisognerebbe scrivere il proprio serializzatore ricorsivo. Qualcosa di simile a questo:

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(); 
} 

Ciò gestire maggior parte dei tipi, ma c'è sempre la possibilità di una stravagante scompigliare in su in modo Non vorrei usare questo nella produzione. Successivamente deserializzazione, è facile come:

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

O_O Perché stai reinventando la ruota? Definire il metodo 'toJSON' per la serializzazione personalizzata di un oggetto, ad es. ' .prototype.toJSON'. Per ancora più flessibilità, definisci un [replacer per 'JSON.stringify'] (https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/JSON/stringify#Syntax). –

+0

@RobW Non sapeva di nessuno di questi. Molto utile, grazie! – Trevor

+0

Molto utile. Grazie! – luisgo

0

di recente ho scritto shovejs: http://shovemedia.github.com/shovejs/ per gestire esattamente questo genere di cose. YMMV - Non l'ho ancora provato con Node.

Converte una struttura di oggetto digitato in JSON (che poi salverebbe su disco) e può riportare la struttura in oggetti dattiloscritti inclusi oggetti appropriati -> riferimenti oggetto ecc. Per essere chiari, le definizioni metodo/classe stesse NON sono serializzati. Il sistema si aspetta semplicemente che le classi modello/fabbrica registrate disponibili durante la serializzazione siano disponibili anche durante la deserializzazione.

Ci scusiamo in anticipo per non aver pubblicato alcuni semplici esempi.

edit: la tecnica è un truccata prendere su ciò che Rob W cita nel suo commento qui sotto

1

La domanda è piuttosto vecchio, ma non riuscivo a trovare da nessuna parte qualche semplice soluzione al problema della serializzazione efficace nel JavaScript.
Si potrebbe usare BSON (rappresentazione di oggetti interni MongoDB) che utilizza un formato binario per rappresentare oggetti in memoria.

non riuscivo a trovare qualche link alla documentazione, ma la code is well documented e mi si avvicinò con qualcosa di simile:

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 

E 'coffee-script ma il codice è abbastanza semplice per tutti di capire.

+0

Attento con l'opzione 'evalFunctions: true' poiché consente l'esecuzione di JavaScript (consultare https://gist.github.com/DinisCruz/245716893d783ea740ea) –

Problemi correlati