如何反序列化未知派生类的JavaScript对象

时间:2011-12-30 18:22:05

标签: javascript json serialization

这是Javascript Serialization of Typed Objects的后续问题。该解决方案适用于类型已知的对象,但现在我有一个类型的对象,该类型的对象未知将执行反序列化。有一个基类“Sprite”,它有许多需要序列化的属性。任何数量的派生类(例如“播放器”和“平台”等)都可以从类Sprite派生并添加它们自己的属性。我还有一个“MapLayer”对象,它包含一个Sprite派生对象的集合。如何对图层及其所有精灵进行反序列化,以便在反序列化完成时每个精灵都具有正确的派生类型。我需要使用eval(“new”+ derivedTypeName + parameterList)吗?还有更好的方法吗?

更多细节: Sprite基类是硬编码的,但所有派生类都是生成的代码。我可以让代码生成器为每个派生类生成反序列化函数,但是如何从泛型基类反序列化函数中适当地调用它们呢?只有一个MapLayer类,不知怎的,它必须在从Sprite派生的所有类上调用deserialize函数。

1 个答案:

答案 0 :(得分:2)

为了调用派生对象的构造函数,首先需要知道要调用哪个构造函数。您没有详细说明当前如何在序列化有效负载中编码该类型信息,所以假设您有类似以下内容:

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);
};

JavaScript /浏览器js环境没有任何内置功能,它为您在.net中熟悉的意义上的“类”提供反序列化。