Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何反序列化未知派生类的JavaScript对象_Javascript_Json_Serialization - Fatal编程技术网

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

如何反序列化未知派生类的JavaScript对象,javascript,json,serialization,Javascript,Json,Serialization,这是我们的后续问题。对于类型已知的对象,该解决方案可以正常工作,但现在我有了一个类型未知的对象,该对象的代码将执行反序列化。有一个基类“Sprite”,它有许多需要序列化的属性。任何数量的派生类(如“Player”和“Platform”等)都可以从类Sprite派生并添加它们自己的属性。我还有一个“MapLayer”对象,它包含一组Sprite派生对象。如何反序列化层及其所有精灵,以便在反序列化完成时每个精灵都是正确的派生类型。我是否需要使用eval(“新建”+derivedTypeName+p

这是我们的后续问题。对于类型已知的对象,该解决方案可以正常工作,但现在我有了一个类型未知的对象,该对象的代码将执行反序列化。有一个基类“Sprite”,它有许多需要序列化的属性。任何数量的派生类(如“Player”和“Platform”等)都可以从类Sprite派生并添加它们自己的属性。我还有一个“MapLayer”对象,它包含一组Sprite派生对象。如何反序列化层及其所有精灵,以便在反序列化完成时每个精灵都是正确的派生类型。我是否需要使用eval(“新建”+derivedTypeName+parameterList)?有更好的办法吗

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

要调用派生对象的构造函数,首先需要知道要调用哪个构造函数。您没有给出当前如何在序列化负载中对该类型信息进行编码的详细信息,因此假设您有如下内容:

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/browser js环境中没有内置任何东西可以提供对.net中熟悉的“类”的反序列化。

考虑将其归结为本质。您引用了另一个问题,但您继续描述了一个与该问题不匹配的场景(例如,您询问的是
new
,这在反序列化中没有使用)@KenBrowning“new”用于该问题的建议答案。这是按名称引用全局命名空间所有成员的唯一/最佳方法:window[]?您可以创建一个新变量,该变量包含对全局命名空间的引用。但更可取的做法是避免“污染”全局命名空间,并将对构造函数的引用存储在其他变量中。然而,我仍然感到困扰的是,如果未知对象存在于不可预测的名称空间中,似乎没有通用的方法来反序列化它自己。在.NET中,您可以简单地使用二进制序列化或反射来检索类型的完全限定名,以便在不考虑名称空间的情况下重新构造相同类型的对象。如果任意“名称空间”中的JavaScript对象决定从可序列化类继承,是否真的不可能进行泛型反序列化?名称空间中不存在JavaScript对象。变量存在于某些范围内。如果您想对构造函数进行寻址(我相信您最初的问题是这样问的),那么对它们的引用需要可以从代码执行的任何范围进行寻址。您熟悉JSON.stringify/parse吗?好的,这是我最后一次尝试。如果您正在寻找类似.net反序列化的东西,那么它是不存在的。您已经在构建自己的序列化机制。如果您需要它来解释派生类型,那么您必须用它来编程。