Блог от AS3Coder'a о JavaScript, HTML, CSS... и немного о Flash.

среда, 11 августа 2010 г.

SharedObject. Сохранение данных на компьютере пользователя.

Что такое SharedObject?

SharedObject - это название класса, с помощью которого .swf-файл может записывать и читать различные данные на компьютере пользователя. Способ записи данных SharedObject имеет сходство с записью файлов сookie в браузерах.

Кроме того, SharedObject может сохранять данные и на сервере. Используется данная возможность в основном в тесной интеграции с Flash Media Server'ом. Рассматривать в рамках этого поста, возможность работы SharedObject с сервером я не буду. Поговорим только о возможностях работы с локальной системой.

Как же это работает?

Работает это следующим образом: один .swf-файл может записать любую информацию на клиентском компьютере только для себя, и прочитать её позже сможет только тот же .swf-файл, который её записал.

Чтобы записать данные нужно:
  1. Получить или создать экземпляр уникального контейнера
  2. Записать в свойство экземпляра "data" необходимые данные
  3. Сохранить данные экземпляра на локальный диск компьютера

var so:SharedObject = SharedObject.getLocal("as3coder-player");
so.data.volume = 100;
so.flush();

При следующем открытии, .swf-файл может прочитать ранее записанные им данные.
  1. Получить экземпляр уникального контейнера
  2. Получить необходимые данные у свойства экземпляра "data"

var so:SharedObject = SharedObject.getLocal("as3coder-player");
var volume:Number = so.data.volume;



Где и как хранятся данные на локальном диске пользователя?

Данные записываются в файлы с расширением "sol" в формате AMF. Найти их можно в директории:

Windows: C:\Users\<Имя пользователя>\AppData\Roaming\Macromedia\Flash Player\#SharedObjects\<Случайное число>\<Имя домена>\<Путь до .swf-файла>\<Имя контейнера>.sol

Mac OS X: ~/Library/Preferences/Macromedia/Flash Player/#SharedObjects/<Случайное число>/<Имя домена>/<Путь к .swf-файлу>/<Имя контейнера>.sol

Для Windows это выглядит так:



Чем открывать .sol-файлы?

Прочитать содержимое .sol-файлов можно, открыв их использую встроенную во FlashDevelop утилиту написанную на C# под названием "SharedObject Reader"


Также можно найти автономную версию этой программы, написанную на Python, "SOLReader".

Но как оказалось, в последних версиях FlashDevelop эта программа не работает. Если кто знает почему или как можно её отремонтировать пожалуйста сообщите в комментариях.

В качестве альтернативы нашлась другая утилита. Называется ".sol Editor". Умеет не только читать но и писать в .sol-файлах. Интересно конечно :) Но как это применить на практике пока не придумаю.



А как же безопасность?

Естественно Adobe позаботились о безопасности такого взаимодействия .swf-файла с файловой системой пользователя и наложили ограничение на объем записываемых данных. По умолчанию он равен 100 Кб. Но пользователь сам вправе решить, насколько он доверяет определенному домену, и может увеличить, уменьшить, либо вообще убрать это ограничение. Сделать это можно в параметрах Adobe Flash Player:





Где и как использовать?

Это вопрос фантазии. Например, в своих медиа-плеерах я записываю громкость звука, чтобы пользователь её постоянно не убавлял или не прибавлял когда заходил заново.



Смотрите также:

9 комментариев:

  1. В 10.1 плеере могли подправить формат файла SharedObject?
    При попытке открыть файл с помощью FD-инструмента вываливается ерорр: "Invalid Header".
    Программа по ссылке тоже падает с похожей ошибкой.

    ОтветитьУдалить
  2. Действительно утилита не работает :( Хотя раньше отлично работала...

    .sol-файлы хранятся в формате AMF. Появился он начиная с 6 версии плеера, сейчас его принято называть AMF 0. Начиная с 9 версии плеера, и с ActionScript 3.0, он стал именоваться AMF 3.

    Но я думаю дело тут не во FlashPlayer. Мне кажется, это какая-то собственная ошибка утилиты. Причем, если верить форуму FlashDevelop, проявляется не у всех.

    В качестве компенсации :) предлагаю другую программу ".sol Editor". Она умеет не только читать, но и редактировать.

    Еще раз приношу свои искренние извинения за недостоверную информацию :(

    ОтветитьУдалить
  3. .sol Editor рулит! спасибо.

    ОтветитьУдалить
  4. Можно ли поместить в so.data экземпляр класса (объект)? Т.е. чтобы при чтении мы получили объект этого класса?

    ОтветитьУдалить
  5. В официальной справке говориться, что можно хранить объекты любого типа. Пробуйте :)

    ОтветитьУдалить
  6. Я бы ещё добавл про кодировку записи. Что из AS3 неудастся роботать с SharedObject AS2-ого.
    http://help.adobe.com/ru_RU/FlashPlatform/reference/actionscript/3/flash/net/SharedObject.html#defaultObjectEncoding

    ОтветитьУдалить
  7. При всем глубоком уважении к автору этой статьи вынужден заметить, что его фраза "swf-файл может записать любую информацию на клиентском компьютере только для себя, и прочитать её позже сможет только тот же .swf-файл, который её записал." не соответсвует действительности.
    В действительности же метод getLocal объекта ShareObject имеет вид:
    getLocal( name: String, [localPath: String], [secure: Boolean]
    и в методе getLocal можно в явном виде указать localPath откуда брать sol- файл. Так можно указать sol -файл созданsq и другим swf- файлом.
    Можно вообще указать localPath к sol- файлу в простейшей форме "\". И тогда к этому sol- файлу смогут обращаться вообще любые swf - файлы из домена, в котором этот sol- файл был создан.
    Если же localPath не указывать, то да действительно по умолчанию создается sol- файл, к которому может иметь доступ, лишь создавший его swf- файл.

    ОтветитьУдалить
  8. Согласитесь, уже само название ShareObject (т.е. Совместно используемый объект) предполагает, что создается некий объект, кторый будет потом совместно использоваться более чем объектом (в данном случае эти объекты это swf- файлы). Использовать ShareObject в режиме, когда число его совместных пользователей (в данном случае swf- файлов), равно единице это явно весьма не полное использование возможностей ShareObject.
    Поэтому, столь неудачную ошибку в статье нужно срочно исправить чтобы не дезинформировать неопытных пользователей. Тогда и мой комментарий можно удалить.

    ОтветитьУдалить

Можно использовать некоторые HTML-теги, например <b>, <i>, <a>

Поиск по блогу

Обо мне



Farid Shamsutdinov (AS3Coder)
Russia, Tatarstan, Kazan
as3coder@gmail.com

Подробнее...

Постоянные читатели

© 2014 Farid Shamsutdinov. При копировании материалов, ссылка на источник обязательна. Технологии Blogger.