Я вижу, как я могу писать объекты в файлы, как описано здесь: How can I save objects to files in Node.js?, но есть ли способ взять объект и записать его таким образом, чтобы я мог перезагрузить объект в память, включая его методы?Запись объектов js в файлы (включая методы) в nodejs?
ответ
Как уже говорилось в @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))
O_O Почему вы изобретаете колесо? Определите метод 'toJSON' для пользовательской сериализации объекта, например. '
@RobW Не знал об этом. Очень полезно, спасибо! – Trevor
Очень полезно. Благодаря! – luisgo
Я недавно написал shovejs: http://shovemedia.github.com/shovejs/ обращаться именно такого рода вещи. YMMV - Я еще не пробовал его с узлом.
Он преобразует типизированную структуру объекта в JSON (которую вы затем сохранили на диск) и может надуть эту структуру обратно на типизированные объекты, включая правильный объект -> ссылки на объекты и т. Д. Чтобы быть ясным, сами определения метода/класса НЕ сериализованы. Система просто ожидает, что зарегистрированные классы Model/Factory, доступные во время сериализации, также доступны во время десериализации.
Извинения за то, что у вас не было простых примеров.
редактировать: техника является форсированным взять на себя то, что упоминает Rob W в своем комментарии ниже
Вопрос довольно старый, но я не мог найти где-нибудь какой-то простое решение вопроса об эффективной сериализации 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 но код достаточно прост для всех, чтобы понять.
Осторожно с этой опцией 'evalFunctions: true', поскольку это позволит выполнить javascript (см. Https://gist.github.com/DinisCruz/245716893d783ea740ea) –
- 1. Включая файлы JS в Derby.js
- 2. Nodejs с ExpressJS, включая внешние файлы кода js для использования
- 3. Включая файлы JS в проект Crossrider
- 4. Включая библиотеки или .js-файлы в webpack
- 5. включая внешние файлы js в laravel 5.1.2
- 6. Включая методы в блоки
- 7. Как передать методы объектов JS?
- 8. Включая файлы js с несколькими языками в файлы PHP
- 9. Запись объектов в выходные текстовые файлы
- 10. Включая пользовательские никакие файлы npm js в углы 2
- 11. Yii включая CSS и JS файлы
- 12. Включая файлы в C
- 13. Запись интернет-аудиопотока в NodeJS
- 14. # включая файлы
- 15. Запись видео, включая запись наложения в iOS
- 16. Включая HTML-фрагменты в страницу - методы?
- 17. Codeigniter, включая javascript файлы
- 18. Неизменяемые методы потери объектов хранилища js
- 19. Консоли проекта в rails3 - application.js не включая другие файлы js?
- 20. Включая файлы CSS и JS в Symfony с использованием Assetic
- 21. Включая файлы CSS и JS в Yii Framework
- 22. Включая Js в шаблон твиста
- 23. методы объектов в основном
- 24. Включая файлы
- 25. чтение/запись объектов класса в файлы в C++
- 26. Включая исходные файлы в файлы C
- 27. Включая файл .js в файле .js
- 28. Включая JS-файл в другой JS-файл
- 29. Включая другие библиотеки/файлы/плагины с nodejs и NPM
- 30. Папка копия, включая файлы в глотках
Функции записи и чтения представляют огромный риск для инъекций. Я бы рассмотрел последствия этого решения для безопасности. –
Я согласен с Энтони. Если вам это действительно нужно, вы можете просто сохранить код JavaScript, затем загрузить его и называть 'eval'. – freakish
Я согласен с соображениями безопасности. Я просто играю с идеей. Благодаря! – luisgo