PDA

Просмотр полной версии : Загрузка массивов и векторов из SharedObjects


a7s1h1
19.12.2013, 17:06
Сохранение в игре делаю через
public static var saved:SharedObject = SharedObject.getLocal('saved')
До некоторых пор сохранял и загружал значения любых переменных без проблем, даже массивы.
Но потом внезапно векторы со строковыми значениями перестали загружаться.

// сохранение
var v:Vector.<String>=new Vector.<String>(['1','2'])
saved.data.v=v

// загрузка
v=saved.data.v

Поставил на загрузку проверку:

trace(saved.data.v); // выводит '1,2'к
v=saved.data.v
trace(v) // выводит null

Странно - подумал я, тем более, что векторы с числами загружались нормально, а векторы типа Vector.<String> - ни в какую: пишет ошибку 1034 о невозможности преобразования объекта в строку.

Решил заставить воспринимать сохранённое значение как вектор:

trace(saved.data.v); // выводит '1,2'
v=saved.data.v as Vector.<String>
trace(v) // выводит null

Ошибка 1034 типа Coercion исчезла, но v по-прежнему равнялся null

Тогда я решил не приравнивать значения, а тупо засунуть в вектор значения из сохранённого вектора.

trace(saved.data.v); // выводит '1,2'
v.push(saved.data.v);
trace(v) // выводит '1,2'


Но проблема осталась, так как вместо v[0]='1'
v[1]='2' всё записалось в нулевую ячейку: v[0]='1,2'


trace(saved.data.v); // выводит '1,2'
v.push(saved.data.v);
trace(v[0]) // выводит '1,2'
trace(v[1]) // выдаёт ошибку о выходе индекса 1 за границы диапазона


И тут у меня опустились руки. В самом деле, не переносить же каждое значение из ячейки в ячейку через цикл! Подскажите, пожалуйста, почему не работает обычное приравнивание, как в случае с векторами int и uint и что с этим можно поделать?
Пробовал плюнуть на векторы возвращаться к массивам - проблема та же.

Akopalipsis
19.12.2013, 17:22
Не смогу обьяснить литературным языком, но вот в этой строчке, Вы помещаете в массив массив.
var v:Vector.<String>=new Vector.<String>(['1','2'])
Попробуйте вот так -
var v:Vector.<String>=new <String>['1','2']

a7s1h1
19.12.2013, 17:33
Не смогу обьяснить литературным языком, но вот в этой строчке, Вы помещаете в массив массив.
var v:Vector.<String>=new Vector.<String>(['1','2'])

На объявление массива не обращайте внимания - написал наспех. Давайте просто считать, что на момент сохранения уже имеется вектор с двумя элементами ['1','2']. И вот он почему-то не загружается:

// сохранение
trace('Saving. saved.data.v='+saved.data.v) // пишет Saving. saved.data.v=undefined
trace('Saving. v='+v);// пишет Saving. v=1,2
saved.data.v = v;
trace('Saved. saved.data.v='+saved.data.v)// Saved. saved.data.v=1,2
// сохранилось нормально. выходим из игры, запускаем заново

// загрузка
trace('Loading. saved.data.v='+saved.data.v) // пишет Loading. saved.data.v=1,2
trace('Loading. v='+v);// пишет Loading. v=
saved.data.v = v;
trace('Loaded. saved.data.v='+saved.data.v)// пишет Loaded. v=null

Wolsh
19.12.2013, 17:33
var v:Vector.<String>=new Vector.<String>(['1','2'])Так вектор не создается. Можно использовать конвертацию
var v:Vector.<String> = Vector.<String>(['1','2']);

Добавлено через 4 минуты
И вот он почему-то не загружается:В смысле не загружается?
Вот же трейс выдает
trace('Loading. saved.data.v='+saved.data.v) // пишет Loading. saved.data.v=1,2
Далее у Вас v не имеет значения, Вы же не присвоили ей значение из saved.data.v!
Поэтому и null.

a7s1h1
19.12.2013, 17:43
Так вектор не создается. Можно использовать конвертацию
var v:Vector.<String> = Vector.<String>(['1','2']);
Wolsh, спасибо огромное! Всё заработало:

v=Vector.<String>(saved.data.v)

Я с самого начала хотел так сделать, но думал, что это то же самое, что v=saved.data.v as Vector.<String>
Это лишний раз доказывает, что надо пробовать все варианты))
Кстати, можете скратце объяснить разницу между 'Class(var)' и 'var as Class'? Я думал, что и то и другое заставляет "обращаться со значением var как с принадлежащим к классу Class"...

Добавлено через 4 минуты
а ещё остаётся открытым вопрос, почему такая фигня только с векторами со значениями String? С int и uint просто приравниваю и всё работает:

// допустим, v - вектор Vector.<uint>, содержащий 3 элемента: [3,8,5]
trace('saved.data.v='+saved.data.v) // saved.data.v=3,8,5
trace('v='+v) // v=
v=saved.data.v;
trace('v='+v) // v=3,8,5
trace('v[0]='+v[0]) // v[0]=3
trace('v[1]='+v[2]) // v[1]=8
trace('v[2]='+v[2]) // v[2]=5

Wolsh
19.12.2013, 18:33
Я не вижу проблемы, Вы показали только то, что работает КАК ДОЛЖНО работать.
Если тот же код не работает со стрингами, то возможно проблема в том, что ваш saved.data.v это массив, а не типизированный вектор, и при преобразовании нетипизированных значений массива в типизированный вектор происходит какой-то облом.
Разница между кастингом as и конвертацией Type() в том, что кастинг не выбрасывает ошибку, а просто возвращает нулл.