ECMAScript / Node: возможно ли сохранить экземпляр объекта или контекст в файловой системе?

1

Можно ли сохранить объект (экземпляр класса) в файловую систему, включая его внутренние значения?

Не помещайте флажок вне темы. Я понимаю, что даже если это как-то достижимо, это не обычная практика. Это не имеет значения, если он взломан. Мне просто интересно, если это может быть достигнуто, потому что в воскресенье 8 часов, и у меня был долгий день.

function Node() {
    let x = Math.random()
    this.data = function() {
        return x
    }
}

let node1 = new Node()
// save it to the disk somehow as node1
saveNode('node1', node1)
// load it back from the disk into memory somehow, perhaps using eval??
let savedNode = loadNode('node1')

console.log(
   savedNode.data(), 
   node1.data()
) /* these should be the same */

Вы можете подстроить объект, включая его функции, с помощью функции "модификатора" в качестве второго аргумента в JSON.stringify, но это не поможет.

  • 4
    Может быть, вы ищете для сериализации?
  • 0
    Хранение функций было бы действительно неэффективным. Может просто сохранить все реквизиты, а затем перепривязать функции под нагрузкой? (это не будет работать для замыканий)
Показать ещё 2 комментария
Теги:

1 ответ

2

Только если объект (или класс) взаимодействует. Нет, в общем случае невозможно получить доступ к значениям, скрытым за областью закрытия.

Однако вы можете сделать что-то вроде

class Node {
    constructor(x = Math.random()) {
        this.data = () => x;
    }
    toJSON() {
        return {x: this.data()};
    }
    static fromJSON(obj) {
        return new this(obj.x);
    }
}

const fs = require("fs");
function save(name, obj) {
    fs.writeFileSync('./${name}.json', JSON.stringify(obj), "utf-8");
}
function load(constr, name) {
    return constr.fromJSON(JSON.parse(fs.readFileSync('./${name}.json', "utf-8");
}

let node1 = new Node();
save('node1', node1);
let savedNode = load(Node, 'node1');
console.log(savedNode.data(), node1.data())

Ещё вопросы

Сообщество Overcoder
Наверх
Меню