Как десериализовать объект JavaScript неизвестного производного класса - PullRequest
1 голос
/ 30 декабря 2011

Это дополнительный вопрос к Сериализация Javascript для типизированных объектов . Это решение работает нормально для объектов, тип которых известен, но теперь у меня есть объект типа, который неизвестен по коду, который будет выполнять десериализацию. Существует базовый класс "Sprite", который имеет ряд свойств, которые необходимо сериализовать. Любое количество производных классов (таких как «Player», «Platform» и т. Д.) Может быть производным от класса Sprite и добавлять свои собственные свойства. У меня также есть объект «MapLayer», который содержит коллекцию объектов, полученных из Sprite. Как десериализовать слой и все его спрайты, чтобы каждый спрайт имел правильный производный тип после завершения десериализации. Нужно ли использовать eval ("new" + производное-имя-типа + параметр-список)? Есть ли лучший способ?

Подробнее: Базовый класс Sprite жестко запрограммирован, но все производные классы являются сгенерированным кодом. Я могу заставить генератор кода генерировать функции десериализации для каждого производного класса, но как мне вызвать их соответствующим образом из универсальной функции десериализации базового класса? Есть только один класс MapLayer, и каким-то образом он должен потенциально вызывать функцию десериализации для всех классов, производных от Sprite.

1 Ответ

2 голосов
/ 30 декабря 2011

Чтобы вызвать функцию конструктора производного объекта, вам сначала нужно узнать, какой конструктор вы хотите вызвать.Вы не сообщаете подробности о том, как вы в настоящее время кодируете эту информацию о типе в вашей сериализованной полезной нагрузке, поэтому предположим, что у вас есть что-то вроде следующего:

var MyDerivedType = function () {...};
MyDerivedType.prototype.__derivedTypeName = 'MyDerivedType';
MyDerivedType.deserialize = function ( input ) {
    var obj = JSON.parse( input );
    return new MyDerivedType( obj );
};

Если вы не назначаете свой производныйвведите в глобальную область видимости, тогда вы должны быть в состоянии обратиться к ним во время десериализации.Вот пример хранения их на самом конструкторе Sprite:

Sprite.derivedTypes = Sprite.derivedTypes || {};
Sprite.derivedTypes['MyDerivedType'] = MyDerivedType;

Тогда вы можете избежать использования eval и вызывать соответствующий десериализатор следующим образом:

Sprite.deserialize = function(input) {

    // json parse the data string to pull out our derived type
    var o = JSON.parse(input);

    // delegate to the derived type's deserialize method
    return Sprite.derivedTypes[o.__derivedTypeName].deserialize(input);
};

Естьничего не встроено в js / browser js среды, которые обеспечивают десериализацию для "классов" в том смысле, в каком вы знакомы с .net.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...