Подтвердить что ты не робот

Python-подобный травление полных объектов Javascript

Существует ли какая-либо структура сериализации для Javascript, которая сохранит класс и справочную информацию, например, соленья Python? То есть можно непосредственно взять прототипный унаследованный экземпляр класса (а не только JSON-подобные данные) и сериализовать его как:

 // Somehow add serialization metadata to classes first
 obj = new MyObject();
 obj.referred = new MyObject2();
 pickle = serializer.dump(obj) // Provides byte stream of the serialized object  

Сериализатор может позаботиться о

  • Информация о кодировании класса в рассоле - это должно быть как-то настраиваемо из-за существования различных систем класса JS

  • Автоматическое сопровождение и сериализация указанных объектов

  • Предоставить крючки для добавления пользовательских кодеров/декодеров для значений (даты являются наиболее распространенным случаем)

Это упростило бы внутреннее хранение и передачу сложных структур данных. Я надеюсь использовать это в игровом движке. Как и при соленьях, десериализация данных будет невозможна без кода orignal Javascript, предоставляющего определения класса.

Какие существуют такие фреймворки для Javascript, которые уже существуют, или мне потребуется развертывание пользовательской системы?

4b9b3361

Ответ 1

Это не подходит идеально, но вы можете попытаться использовать occamsrazor.js. Для этого вы можете использовать сериализацию JSON:

// this is your costructor function
function Circle(attrs){
    this.radius = attrs.radius;
}
Circle.prototype.area = function (){
    return this.radius*this.radius*Math.PI;
}
Circle.prototype.perimeter = function (){
    return 2*this.radius*Math.PI;
}

// this is a validator
function hasRadius(obj){
    return radius in obj;
}

// this is your factory function
objFactory = occamsrazor().addContructor(hasRadius, Circle);

// this is your deserialized object
var json = '{"radius": 10}';

// circle now is a full fledged object
var circle = objFactory(JSON.parse(json));

Недостатком является то, что вы не получаете моментальный снимок объекта, например, используя pickle, вы воссоздаете новый объект. Но это может быть удобно в некоторых мероприятиях.

Ответ 2

Возможно, вы захотите посмотреть hunterloftis/cryo. Из файла readme:

Построен для node.js и браузеров. Cryo вдохновлен Python pickle и работает аналогично JSON.stringify() и JSON.parse(). Cryo.stringify() и Cryo.parse() улучшают JSON в следующих обстоятельствах:

  • Undefined
  • Дата
  • Бесконечность
  • Ссылки на объекты
  • Прикрепленные свойства
  • Функции
  • Узлы DOM

Существует краткое обсуждение с автором в r/programming.

Источник является простым, без магии.

Я еще не пробовал.

Ответ 3

Отъезд msgpack. Хотя я не использовал его для объектов JavaScript, пример, похоже, подразумевает, что он будет работать для объектов, а не только для JSON. Дополнительный бонус: это одна из самых быстрых реализаций, которые я когда-либо использовал для сериализации.

Ответ 5

Вот несколько:

Джейсон: Полное раскрытие: я сделал это. Но я использую его, и это мои лучшие рекомендации по полной сериализации javascript. Вероятно, вы будете испытывать гораздо меньшую боль, используя этот, чем любой другой, и я был бы в восторге от добавления дополнений в библиотеку, если это не соответствует вашим потребностям! Информация прототипа/конструктора, несколько ссылок на один и тот же объект, имеет крючки для пользовательских типов. Сохраняет копию прототипа, если вы явно не добавите прототип в список констант, и в этом случае он использует уже существующий прототип при перестройке. Репликатор стиля JSON и способы ссылки на объекты, которые будут существовать во время разбора. Сериализует Date, RegExp, null, NaN, Infinity, -Infinity, функцию, DOM-элемент, событие и обычные объекты. Все еще не проверенная и проверенная библиотека, но если это не сработает для вас, вы можете отправить мне электронное письмо, и я попытаюсь исправить это. https://github.com/johnlarson/Jason

ResurrectJS: информация о прототипе/конструкторе, несколько ссылок на один и тот же объект, без перехвата. Использует свойство "конструктор" для получения конструктора, и существуют определенные ограничения с пространствами имен конструкторов, которые вы можете обойти с помощью специального распознавателя пространства имен. Имеет замену JSON-стиля. Сериализует Date, RegExp, DOM Elements, NaN, Infinity, -Infinity и обычные объекты. Более зрелые и более проверенные с помощью использования, чем Джейсон, но труднее использовать правильно. https://github.com/skeeto/resurrect-js

SnapShot: Я не пробовал это. Это выглядит многообещающим, но последний раз обновлялось 3 года назад. Насколько я могу судить, никакой автоматической информации о прототипе/конструкторе, но у нее есть крючок api для определения пользовательского поведения сериализации/десериализации, подобного JSON toJSON и из JSON. Обрабатывает несколько ссылок на один и тот же объект. Насколько я могу судить, заменитель JSON-стиля. Сериализует Date, RegExp, null и функцию. https://github.com/mixu/snapshot

JASON: Еще одна многообещающая библиотека, которую я не пробовал, которая была обновлена ​​3 года назад. Я не знаю, работает ли он прототип/конструкторы. Обрабатывает несколько ссылок на один и тот же объект. Насколько я знаю, у него нет крючков. Я не знаю, имеет ли он заменитель стиля JSON. Сериализует 'Даты, RegExps, Булевы и т.д.' и "все примитивы JS, включая undefined". https://github.com/xk/JASON