Veo cómo puedo escribir objetos en los archivos como se describe aquí: How can I save objects to files in Node.js?, pero ¿hay alguna manera de tomar un objeto y escribirlo de forma que pueda volver a cargar el objeto en la memoria, incluidos sus métodos?escribiendo objetos js a los archivos (incluidos los métodos) en nodejs?
Respuesta
Como dijo antes @AnthonySottile, esto puede ser extremadamente peligroso y no estoy seguro de que haya alguna vez un buen caso de uso para él, pero solo para patadas y risas necesitaría escribir su propio serializador recursivo. Algo como esto:
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();
}
Esto manejar la mayoría de los tipos, pero siempre existe la posibilidad de que un bicho raro mezclarlo por lo yo no usaría esto en la producción. Después de revertir la seriación es tan fácil como:
eval('var test = ' + dump_to_string(obj))
O_O ¿Por qué estás reinventando la rueda? Defina el método 'toJSON' para la serialización personalizada de un objeto, ej. '
@RobW No sabía nada de eso. Muy útil, gracias! – Trevor
Muy útil. ¡Gracias! – luisgo
Hace poco escribió shovejs: http://shovemedia.github.com/shovejs/ para manejar exactamente este tipo de cosas. YMMV: aún no lo he probado con Node.
Convierte una estructura de objeto tipado en JSON (que luego guardaría en el disco) y puede inflar esa estructura de nuevo en objetos tipeados incluyendo el objeto adecuado -> referencias de objeto etc. Para que quede claro, las definiciones de método/clase NO están serializados. El sistema simplemente espera que las clases registradas de Modelo/Fábrica disponibles durante la serialización también estén disponibles durante la deserialización.
Disculpas de antemano por no haber publicado algunos ejemplos sencillos.
edición: la técnica es un trucado asumir lo que Rob W menciona en su comentario a continuación
La pregunta es bastante antiguo, pero no pude encontrar en cualquier lugar alguna solución sencilla a la pregunta de serialización eficaz en JavaScript.
Se podría usar BSON (representación de objetos internos MongoDB) que utiliza un formato binario para representar objetos en la memoria.
no pude encontrar algún vínculo con la documentación, pero el code is well documented y se me ocurrió algo similar:
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
Es coffee-script pero el código es bastante simple de entender para todos.
Cuidado con la opción 'evalFunctions: true' ya que permitirá la ejecución de javascript (ver https://gist.github.com/DinisCruz/245716893d783ea740ea) –
- 1. JSONCPP Escribiendo en los archivos
- 2. Dónde colocar los archivos JS para NodeJS para verlos
- 3. .NET Remoting, pasando objetos a los métodos
- 4. Acceder a las variables de los archivos incluidos en Ruby
- 5. ¿Cómo encapsulo los métodos de módulo incluidos en Ruby?
- 6. SQL para buscar objetos, incluidos los procedimientos almacenados, en Oracle
- 7. dónde colocar los archivos js en CodeIgniter
- 8. Archivos JS incluidos dos veces en la aplicación de raíles
- 9. Rieles usando ayudantes incluidos dentro de los métodos de clase
- 10. ¿Hay alguna herramienta para combinar archivos JS frontales en NodeJS?
- 11. "git add * .js" no agregó los archivos en los subdirectorios
- 12. NodeJS no volverán a los datos jQuery.getJSON
- 13. Cómo obtener archivos en un directorio, incluidos todos los subdirectorios
- 14. Plantillas T4: evite las líneas vacías de los archivos incluidos
- 15. Cómo utilizar rutas relativas para los archivos incluidos como Css
- 16. Escribiendo objetos miembros en paquetes
- 17. git: lista de todos los archivos modificados incluidos los de los submódulos
- 18. Cómo utilizar los objetos del módulo global NodeJS en los módulos RequireJS
- 19. ¿Cómo recuperar todos los objetos de una colección de Mongodb, incluidos los identificadores?
- 20. Optional.absent() Los valores a los métodos concisa
- 21. .htaccess index.php redirección a la raíz (incluidos los subdominios)
- 22. nodejs se cuelga con los archivos estáticos expresos
- 23. ArrayList y modificando objetos incluidos
- 24. nodejs, ejecuta la prueba automáticamente cuando cambian los archivos
- 25. ¿Por qué los funtores de C++ son preferibles a los objetos con métodos con nombre?
- 26. ¿Cómo aprendo los métodos a los que se puede acceder para ciertos objetos?
- 27. Calcula programáticamente la memoria ocupada por un objeto Java, incluidos los objetos a los que hace referencia
- 28. Mercurial: ¿cómo descartar todos los cambios locales, incluidos los archivos no versionados?
- 29. Recuperando archivos de los objetos de Git
- 30. ¿Cuál es la unidad para los objetos Three js?
Las funciones de escritura y lectura presentan un gran riesgo de inyección. Consideraría las implicaciones de seguridad de esta decisión. –
Estoy de acuerdo con Anthony. Si realmente lo necesita, simplemente puede guardar el código JavaScript, luego cargarlo y llamar a 'eval' en él. – freakish
Estoy de acuerdo con las preocupaciones de seguridad. Solo estoy jugando con una idea. ¡Gracias! – luisgo