Сериализация сложного, вложенного, определенного пользователем объекта в строку в JavaScript - PullRequest
0 голосов
/ 10 декабря 2018

Я работаю со следующим сложным объектом:

ObjectA {
    somearr: [
        ObjectB {
           somevar: ObjectD {...},
           somecircularvar: pointer
        },
        ObjectC {...},
        ...
    ],
    someobj: ObjectE {
        someothercircularvar: pointer,
        somevar: ObjectF {...}
    },
    someMethod: ...
}

Вышеуказанный объект имеет следующее:

  • Вложенные объекты
  • Круговые ссылки на многие местоположениявнутри объекта (не только основной ссылки)
  • Пользовательские объекты

Основной вопрос : Как превратить это object вstring для хранения и как мне разобрать string обратно в object со всеми методами и переменными, как есть?


Вещи, которые я пробовал :

  • Библиотеки
    • Flatted.js
    • Cyro.js
    • JSONfn.js
  • Поиски
    • Существующие вопросы о переполнении стека (кажется, ни один из них не имел отношения к моему уродству)
    • Сканирование в Google для поиска определенных пользователем объектов (они не могли справиться с циклическими)

Попробовав это, я увидел, что все "решения" имеют дело с круглыми и вложенными объектами, не определены пользователемобъекты .

Я помню, как пробовал пару других библиотек, но ни одна из них не могла работать с круглыми, вложенными и пользовательскими объектами одновременно.

Ближайшее, что я получилto следующий синтаксический анализ:

{
    somearr: [
        {
           somevar: {...},
           somecircularvar: pointer
        },
        {...},
        ...
    ],
    someobj: {
        someothercircularvar: pointer, // Circular pointer conserved
        somevar: {...}
    }
}

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

Огромное спасибо заранее человеку, который может решить эту проблему.

1 Ответ

0 голосов
/ 10 декабря 2018

Правильно, это похоже на сериализацию объекта данных, но не класса данных.Переменные сохраняются, но мета-данные о классе (а именно методы ) не сохраняются.

Одним из решений может быть serialijse .

serialijse - это простая структура персистентности для JavaScript, которая преодолевает два основных ограничения персистентности JSON:

  • serialijse хорошо работает с циклическими объектами.
  • serialijse сохраняет класс объекта при десериализации.

Их третий пример демонстрирует ваш случай:

// serializing an object with cyclic dependencies
function testing_javascript_serialization_objects_with_cyclic_dependencies() {

    var Mary = { name: "Mary", friends: [] };
    var Bob = { name: "Bob", friends: [] };

    Mary.friends.push(Bob);
    Bob.friends.push(Mary);

    var group = [ Mary, Bob];
    console.log(group);

    // testing serialization using  JSON.stringify/JSON.parse
    try {
        var jstr = JSON.stringify(group);
        var jo = JSON.parse(jstr);
        console.log(jo);

    } catch (err) {
        console.log(" JSON has failed to manage object with cyclic deps");
        console.log("  and has generated the following error message", err.message);
    }

    // now testing serialization using serialijse  serialize/deserialize
    var str = s.serialize(group);
    var so = s.deserialize(str);
    console.log(" However Serialijse knows to manage object with cyclic deps !");
    console.log(so);
    assert(so[0].friends[0] == so[1]); // Mary's friend is Bob
}
testing_javascript_serialization_objects_with_cyclic_dependencies();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...