我问的问题没有得到很好的回答(结果让我发布了这个问题)。
我试图在我正在制作的游戏中动态保存对象(我已经有一个保存功能,它只是笨重而且我想提高它的效率)。此动态保存涉及的是检查您正在保存的对象的所有变量当前是否使用getClassByAlias
功能进行了注册。这是代码的第一部分:
var objectClass:* = getDefinitionByName(getQualifiedClassName(saveItem));
try {(getClassByAlias(getQualifiedClassName(saveItem)));}
catch (err:Error) {registerClassAlias(getQualifiedClassName(saveItem), objectClass);}
这样做的目的是检查对象的类当前是否已注册,如果不是,则进行注册。不幸的是,我有许多类包含其他自定义类的变量,还必须注册这些类。我不想手动注册每个类,所以我一直在尝试做的是迭代当前对象的所有变量,如果该变量的类没有注册它注册它然后迭代这些变量的变量并继续注册,依此类推,直到所有未注册的类都被注册。这样我就可以保存任何我想要的东西,因为它会记录所有未经注册的变量,并且会让我的工作变得更加轻松。
在运行时看到对象变量的唯一方法是使用describeType
函数。这将返回一个XML实例,然后您可以使用..variable
(这是一个XMLList)访问变量。这是我被卡住的地方。我需要一种方法将此XML代码转换回变量,以便我可以访问其变量以检查是否有任何未注册的变量。这是一个XML代码的示例,它引用了我正在迭代的自定义类的自定义类变量:
<variable name="itemCondition" type="item::ItemCondition">
<metadata name="__go_to_definition_help">
<arg key="pos" value="882"/>
</metadata>
</variable>
我需要一种方法将其转换回原始的ItemCondition,以便我可以浏览其变量并继续注册。这或多或少是我需要的代码(以及我目前所拥有的代码)的细分:
private static function registerVariables(saveItem:*):void {
var objectClass:* = getDefinitionByName(getQualifiedClassName(saveItem));
try {(getClassByAlias(getQualifiedClassName(saveItem)));}
catch (err:Error) {registerClassAlias(getQualifiedClassName(saveItem), objectClass);}
for each (var variable:XML in describeType(saveItem)..variable) {
var currentVariable:* = SaveAndLoad.xmlToObject(variable);
var currentClass:* = getDefinitionByName(getQualifiedClassName(currentVariable));
try {(getClassByAlias(getQualifiedClassName(currentVariable)));}
catch (err:Error) {
registerClassAlias(getQualifiedClassName(currentVariable), currentClass);
SaveAndLoad.registerVariables(currentVariable);
}
}
}
private static function xmlToObject(variable:XML):* {
//Code here that gives me the reference to the current variable
}
非常感谢任何帮助。我的兄弟使用Java / C ++并且做了一些与此类似的东西,我希望在Flash中有一种方法。
答案 0 :(得分:1)
我发现了问题,这简直太容易了。我可以使用[]
访问项目的变量。我使用XMLList
从variable.@name
中获取变量名称,并返回当前变量名称的String。从那里我所要做的就是放currentVariable:* = saveItem[variable.@name];
,这样就可以了。