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?
risposta
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))
O_O Perché stai reinventando la ruota? Definire il metodo 'toJSON' per la serializzazione personalizzata di un oggetto, ad es. '
@RobW Non sapeva di nessuno di questi. Molto utile, grazie! – Trevor
Molto utile. Grazie! – luisgo
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
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.
Attento con l'opzione 'evalFunctions: true' poiché consente l'esecuzione di JavaScript (consultare https://gist.github.com/DinisCruz/245716893d783ea740ea) –
- 1. Come passare i metodi degli oggetti JS?
- 2. Compresi i file .cpp
- 3. Quale è più veloce, scrivendo dati grezzi su un'unità o scrivendo su un file?
- 4. Compresi i cst bootstrap in Aurelia
- 5. compresi i parametri in OPENQUERY
- 6. Modulo Nodejs per trovare i file?
- 7. JS - catena di arresto di metodi di oggetti senza errori
- 8. Riorientare stdout su file nodejs
- 9. python, scrivendo Json al file
- 10. angular2: compresi gli script js di terze parti nel componente
- 11. file texture Compresi nel file Collada
- 12. Metodi di fabbrica in più file Angolare JS
- 13. Utilizzo di Jquery per consentire eventi su oggetti JS regolari
- 14. percorso file ed elimina file in nodejs
- 15. cmake compresi i file h da altre directory
- 16. Caricamento file su un server JS Node
- 17. Come confrontare gli oggetti buffer in NodeJS?
- 18. Estensione di un modulo Ruby in un altro modulo, compresi i metodi del modulo
- 19. Perforce - genera una diff compresi i file aggiunti?
- 20. Fonti su oggetti S4, metodi e programmazione in R
- 21. StreamWriter sta scrivendo i ritorni a capo?
- 22. oggetti cliccabili three js
- 23. dove mettere i file JS in CodeIgniter
- 24. Collegamenti ipertestuali in oggetti d3.js
- 25. Scrivendo XML in Java FileNotFoundException
- 26. Nodejs - Verifica file nascosti
- 27. In Scala, combina metodi di oggetti come metodi di classe
- 28. Come sapere i comandi che sto scrivendo?
- 29. nodejs scrive i dati delle immagini raw in file jpeg?
- 30. Plugin Maven Jasmine compresi i miei script utilizzando il protocollo file
Le funzioni di scrittura e lettura presentano un enorme rischio di iniezione. Prenderò in considerazione le implicazioni di sicurezza di questa decisione. –
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
Sono d'accordo sui problemi di sicurezza. Sto solo giocando con un'idea. Grazie! – luisgo