Как уже упоминалось, в ActionScript для хранения данных на компьютере пользователя или сервере используется класс SharedObject ("совместно используемый объект" или "общий объект"). При этом общие объекты существуют двух разновидностей:
1.) Удалённые общие объекты (Remote Shared Objects, RSO), которые в своей работе используют серверные технологии.
2.) Локальные совместно используемые объекты (Local Shared Objects, LSO), которые хранят данные непосредственно на компьютере клиента.
Последний способ хранения данных довольно сильно напоминает куки (cookies), широко используемые в веб-программирование. Из-за этого сходства LSO иногда так и называют - flash-куки (flash cookies).
Объекты LSO хранятся в специальном каталоге на компьютере пользователя в виде двоичных файлов с расширением .sol. Путь к этим файлам зависит от используемой OC, а сами файлы могут быть скрытыми. Но если мы всё же найдём искомую папку и файл, то увидим примерно следующее:
На ПК может одновременно храниться множество sol-файлов и они могут располагаться в разных каталогах. Естественно, что в этих условиях имена файлов и путь к ним должны быть уникальными (именно поэтому в качестве имён часто используют адреса веб-ресурсов).
Важным моментом является то, что размеры LSO лимитированы. Причём размеры Local Shared Objects зависят от пользователя, который может как увеличить размеры хранилища, так и уменьшить или даже полностью запретить хранение данных на локальном компьютере. Доступ к настройкам локального хранилища доступен через контекстное меню флеш-плеера.
Наводим курсор на экран флеш-плеера и нажимаем правую клавишу мышки. Если размеры swf-файла не менее 215 X 138 пикселов, то появится контекстное меню (может различаться для разных версий флеш-плееров):
В контекстном меню выбираем пункт ПАРАМЕТРЫ. Появляется диалоговое окно, в котором можно настроить целый ряд важных параметров флеш-плейера. Отдельная вкладка посвящена настройке локального хранилища Flash Player.
Работать с локальными общими объектами в ActionScript 3.0 также просто, как и в ActionScript 2.0.
Код ActionScript 3.0:
/*
Создаём (если он ещё не создан) или открываем (если он уже существует на компьютере пользователя) LSO.
Метод getLocal() имеет два важных параметра:
1. имя для данного LSO;
2. локальный путь к LSO.
*/
var so:SharedObject = SharedObject.getLocal("edapskov","/");
/*
Объект LSO имеет свойство data, в котором и хранятся переменные.
Поэтому, для сохранения данных используем код вида:
объект_LSO.data.переменная = значение;
В LSO можно сохранять объекты разных типов данных.
*/
so.data.myVarBoolean = true;// сохраняем переменную типа Boolean
so.data.myVarInt = -10;// сохраняем переменную типа int
so.data.myVarUint = 10;// сохраняем переменную типа uint
so.data.myVarNumber = 10.256;// сохраняем переменную типа Number
so.data.myVarString = "Александр";// сохраняем переменную типа String
so.data.myVarArray = ['Бакунин','Прудон','Штирнер'];// сохраняем массив
so.data.myVarDate = new Date();// сохраняем дату
so.data.myVarObject = {first_name:'Пётр',last_name:'Кропоткин'};// сохраняем объект
/*
Флеш-плеер автоматически сохраняет данные LSO на компьютере пользователя, но всё же руководства по языку AS рекомендуют делать это явно с помощью метода flush().
*/
so.flush();
/*
Чтение данных из LSO.
*/
trace("Значения сохранённых в LSO переменных:");
trace(so.data.myVarBoolean);
trace(so.data.myVarInt);
trace(so.data.myVarUint);
trace(so.data.myVarNumber);
trace(so.data.myVarString);
trace(so.data.myVarArray);
trace(so.data.myVarDate);
trace(so.data.myVarObject.first_name + ' ' + so.data.myVarObject.last_name);
/*
Узнаём размер LSO в байтах.
*/
trace("Размер LSO: "+so.size+" байт");
Хотя простого вызова метода flush(), как правило, вполне достаточно для явной записи общего объекта на жесткий диск, ряд руководств рекомендует проконтролировать данный процесс. Так, "ActionScript 3.0. Сборник рецептов." предлагает конструкцию следующего вида:
try
{
var flushResult:String = so.flush();
if (flushResult == SharedObjectFlushStatus.PENDING)
{
so.addEventListener(NetStatusEvent.NET_STATUS, onStatus);
}
else if (flushResult == SharedObjectFlushStatus.FLUSHED)
{
trace('Данные успешно сохранены.');
}
}
catch (е:Error)
{
trace('Недостаточно памяти для сохранения данных. Внесите изменения в настройки флеш-плеера.');
Security.showSettings( SecurityPanel.LOCAL_STORAGE);
}
function onStatus( event:NetStatusEvent ):void
{
if (event.info.code == "SharedObject.Flush.Success")
{
trace('Данные успешно сохранены.');
}
else if (event.info.code == "SharedObject.Flush.Failed")
{
trace('Не удалось сохранить данные.');
}
so.removeEventListener(NetStatusEvent.NET_STATUS, onStatus);
}
Для того, чтобы очистить локальный общий объект от хранимой в нём информации, достаточно вызвать метод clear():
so.clear();
LSO довольно удобный механизм для хранения информации на стороне клиента. Главные его достоинства:
- хранение больших объёмов информации;
- хранение информации без ограничений по времени (как в куки);
- хранение разнотипной информации.
Есть и недостатки. Главный недостаток локальных общих объектов для флеш-разработчиков - полная зависимость от воли пользователя, который может даже запретить использование LSO своим флеш-плеером. Впрочем, это субъективное мнение :-)