Я задаю вопрос, на который не ответил очень хорошо (и, как результат, заставил меня опубликовать этот вопрос).Итерация через переменные объекта
Я пытаюсь динамически сохранять объекты в игре, которую я делаю (у меня уже есть функция сохранения, она просто неуклюжая, и я хочу сделать ее более эффективной). Это связано с тем, что все переменные объекта, которые вы сохраняете, регистрируются с помощью функции 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 появился способ.
На самом деле, я бы предпочел написать один перечислитель классов вашего проекта, зарегистрировать их где-нибудь в 'Main.init()' и пропустить все это. Вы все равно должны были бы реализовать 'readExternal()' и 'writeExternal()' во всех них, которые не состоят только из общедоступных переменных. – Vesper
Спасибо за предложение! Через некоторое время решение (по крайней мере, для моей проблемы) поразило меня и на самом деле действительно было очень просто. Чтобы получить доступ к переменной, которая не была зарегистрирована, мне нужно было только «var currentVariable: * = saveItem [variable. @ Name];», и оттуда я на этот раз просто вызвал «registerVariables», используя 'currentVariable' как' saveItem' – ugotopia123
Не оставляйте ответы в комментариях. Если вы сами решили свою проблему, отправьте ответ на свой вопрос. Не оставляйте этот вопрос без приглашения. – null