共有オブジェクトについて
共有オブジェクトについて
■共有オブジェクトについて
共有オブジェクトは、記憶領域(ストレージ)の一種です。
SharedObject を使用すると、データをローカル環境に保存する事ができます。
■保存可能なデータ型について
保存できるのは、Boolean、Number、String、Array、Object 型などです。
■シリアライズ後のフォーマットについて
フォーマットは、Action Message Format 形式です。
ファイルの拡張子は、「.sol」となります。
ActionScript3.0 では、AMF 形式の読み書きに対応しています。
■ .sol ファイルの保存場所について
ハードディスク内を、"SharedObjects" や "*.sol" などで検索します。
Windows XP の場合
C:\Documents and Settings\[ユーザー名]\Application Data\Macromedia\Flash Player\#SharedObjects\
Windows 7 の場合
C:\Users\[ユーザー名]\AppData\Roaming\Macromedia\Flash Player\#SharedObjects\
■ユーザーによる共有オブジェクトの管理について
ブラウザによっては、Cookie を削除すると、共有オブジェクトも連動して削除されます。
Flash Player の設定から、共有オブジェクトを削除する事もできます。
共有オブジェクトを作成する
サンプルをダウンロード
■共有オブジェクトを作成する
共有オブジェクトを作成するにば、SharedObject.getLocal() メソッドを使用します。
保存データが既に存在する場合、読み込み処理も同時に行われます。
引数に不備がある場合、エラーが発生します。
SharedObject.getLocal( "名前" , "ローカルパス" , セキュア? ) :SharedObject
第01引数 | String | 共有オブジェクト名を指定 |
第02引数(略可) | String | ローカルパスを指定(共有範囲) |
第03引数(略可) | Boolean | [Flash 8 以降] セキュア専用の共有オブジェクトを作成するなら true を指定 |
戻り値 | Void | SharedObject オブジェクトが得られる。 |
■作成例
共有オブジェクトを作成する
import flash.net.SharedObject;
// 共有オブジェクトを作成する
var shared_obj:SharedObject = SharedObject.getLocal("my_data");
ドメイン内のすべての Flash からアクセス可能な共有オブジェクトを作成する
import flash.net.SharedObject;
// 共有オブジェクトを作成する
var shared_obj:SharedObject = SharedObject.getLocal("my_data" , "/");
■第01引数 共有オブジェクト名
『 ? % & \ ; : " ' , < > ? # 』などの記号を含める事はできません。
「名前.sol」というファイル名で、実際にローカルに保存されます。
■第02引数 ローカルパス(共有範囲)
ストレージの共有については、こちらで解説しています。
ドメイン名を除いた、ファイルパスを指定します。
自身の格納場所から、URL を、ディレクトリ単位で削ります。
例えば、「http://example.com/aaa/bbb/ccc/my.swf」は、以下の指定が可能です。
http://example.com/aaa/bbb/ccc/my.swf で動作している場合
SharedObject.getLocal( "my_data" , "/aaa/bbb/ccc/my.swf" );
SharedObject.getLocal( "my_data" , "/aaa/bbb/ccc" );
SharedObject.getLocal( "my_data" , "/aaa/bbb" );
SharedObject.getLocal( "my_data" , "/aaa" );
SharedObject.getLocal( "my_data" , "/" );
■第03引数 セキュア (Flash 8 以降で動作)
自身がセキュア(https) な環境である場合に設定します。
true を指定すると、セキュア専用の共有オブジェクトを作成します。
これにより、アンセキュア(http) な環境との共有を拒絶します。
false を指定すると、通常の共有オブジェクトを作成します。
デフォルトは false です。
自身がアンセキュア(http) な環境である場合に、true を指定すると失敗します。
■ストレージの共有について
自身が作った共有オブジェクトは、別の Flash からもアクセスできます。
■デフォルトの動作について
デフォルトでは、ストレージは共有されません。
ストレージは、URL 単位で隔離されています。
例えば、ファイル名を変更すると、元の共有オブジェクトにはアクセスできなくなります。
■クロスドメインのセキュリティについて
別のドメインとストレージを共有する事はできません。
解除する方法もありません。
■共有範囲の設定について(ローカルパスの設定)
getLocal() メソッドの第02引数から、ローカルパスを指定します。
ローカルパスを含む、すべての Flash に対して、自身との共有を許します。
例えば、"/aaa/bbb" と記述した場合、
「http://example.com/aaa/bbb/my.swf」や
「http://example.com/aaa/bbb/other.swf」や
「http://example.com/aaa/bbb/ccc/other.swf」や
「http://example.com/aaa/bbb/ccc/ddd/other.swf」などは、
同じ共有オブジェクトにアクセスできるようになります。
■グローバルな共有オブジェクトについて
"/" の指定は、最大のセキュリティリスクがあります。
ドメイン内のすべての Flash に対して、自身との共有を許します。
■ローカル環境の場合
ローカル環境にある Flash は、"localhost" というドメイン名で管理されます。
ローカルで実行される、すべての Flash は、ストレージを共有できる可能性があります。
共有オブジェクトにデータを保存する
■共有オブジェクトにデータを書き込む
data プロパティを使用します。
data プロパティの中身は、コレクション用のオブジェクトです。
ドットアクセス演算子や配列アクセス演算子を使って、プロパティを追加します。
キーと値をセットにして、個別にデータを保存する事ができます。
共有オブジェクトにデータを書き込む
import flash.net.SharedObject;
try{
// ------------------------------------------------------------
// 共有オブジェクトを作成する
// ------------------------------------------------------------
var shared_obj:SharedObject = SharedObject.getLocal("my_data");
// ------------------------------------------------------------
// 共有オブジェクトにデータを書き込む(ドットアクセス演算子の場合)
// ------------------------------------------------------------
shared_obj.data.key0 = "書き込みテスト";
shared_obj.data.key1 = 123456;
shared_obj.data.key2 = ["a","b","c","d","e"];
shared_obj.data.key3 = { a:0 , b:1 , c:2 };
// ------------------------------------------------------------
// 共有オブジェクトにデータを書き込む(配列アクセス演算子の場合)
// ------------------------------------------------------------
shared_obj.data["添字0"] = "書き込みテスト";
shared_obj.data["添字1"] = 123456;
shared_obj.data["添字2"] = ["a","b","c","d","e"];
shared_obj.data["添字3"] = { a:0 , b:1 , c:2 };
// ------------------------------------------------------------
// 共有オブジェクトをフラッシュする
// ------------------------------------------------------------
shared_obj.flush();
}catch(e:Error){
}
■リファレンス型データの保存に注意
Array や Object 型は、まとめて保存ができるので便利です。
これらの書き込みを行った場合、データはコピーされません。
実態は参照渡しなので、常に保存の対象となる状態に陥ります。
保存処理を行った後で、リファレンス型データの中身を変更すると、ストレージにも反映されてしまいます。
リファレンス型データの保存に注意
import flash.net.SharedObject;
// ------------------------------------------------------------
// 保存用のオブジェクト
// ------------------------------------------------------------
var save_obj:Object = {
aaa:"保存データA",
bbb:"保存データB",
ccc:"保存データC"
};
try{
// ------------------------------------------------------------
// 共有オブジェクトを作成する
// ------------------------------------------------------------
var shared_obj:SharedObject = SharedObject.getLocal("my_data");
// ------------------------------------------------------------
// 共有オブジェクトにデータを書き込む(実態はコピーではなく参照渡し)
// ------------------------------------------------------------
shared_obj.data.key = save_obj;
// ------------------------------------------------------------
// 共有オブジェクトをフラッシュして、参照を断つ(ここで一連の処理は完了したかのように見える)
// ------------------------------------------------------------
shared_obj.flush();
shared_obj = null;
// ------------------------------------------------------------
// この変更はストレージにも反映されてしまう(共有オブジェクトから参照されているため)
// ------------------------------------------------------------
save_obj.aaa = "更新A";
save_obj.bbb = "更新B";
save_obj.ccc = "更新C";
}catch(e:Error){
}
■リファレンス型データを複製してから保存する
参照を断ち切るには、リファレンス型データを複製します。
オブジェクトの複製については、こちらで解説しています。
■共有オブジェクトをフラッシュする
ローカルへの書き込みは、すぐに実行されるとは限りません。
Flash が消滅する直前などのタイミングで、まとめて実行されるでしょう。
ローカルへの書き込みを今すぐ実行するには、flush() メソッドを使用します。
戻り値から、フラッシュに成功したかを知る事ができます。
フラッシュに失敗した場合、エラーが発生します。
確認ダイアログを表示したくない場合は、このメソッドは使用しません。
SharedObject.flush( 保存サイズ ) :String
第01引数(略可) | int | ユーザーに要求する保存サイズを指定。 |
戻り値 | String | 結果が得られる。SharedObjectFlushStatus.* |
■第01引数 保存サイズ
ユーザーに要求する保存サイズを指定します。
指定したサイズや、実際に書き込まれるサイズが、ユーザーの設定によって制限されているバイト数を超える場合は、確認用のダイアログが表示されます。
確認用ダイアログは、非同期的に実行されます。
この結果を取得するには、NetStatusEvent.NET_STATUS イベントを使用します。
■戻り値 結果
以下の定数が得られます。
ハードディスクへの書き込みは、同期的に実行されます。
定数 | 説明 |
SharedObject | ローカルへの書き込みが成功した。 |
SharedObject | ユーザーに確認用のダイアログを表示した。(結果はイベントで取得) |
■使用例
共有オブジェクトをフラッシュする
import flash.net.SharedObject;
import flash.net.SharedObjectFlushStatus;
try{
// ------------------------------------------------------------
// 共有オブジェクトを作成する
// ------------------------------------------------------------
var shared_obj:SharedObject = SharedObject.getLocal("my_data");
// ------------------------------------------------------------
// 共有オブジェクトにデータを書き込む
// ------------------------------------------------------------
shared_obj.data.key0 = "書き込みテスト";
shared_obj.data.key1 = 123456;
shared_obj.data.key2 = ["a","b","c","d","e"];
shared_obj.data.key3 = { a:0 , b:1 , c:2 };
try{
// ------------------------------------------------------------
// 共有オブジェクトをフラッシュする
// ------------------------------------------------------------
var status:String = shared_obj.flush();
// ------------------------------------------------------------
// フラッシュの結果
// ------------------------------------------------------------
switch(status){
case SharedObjectFlushStatus.PENDING:
trace ("ユーザーに確認用のダイアログを表示した");
break;
case SharedObjectFlushStatus.FLUSHED:
trace ("ローカルへの書き込みが成功した");
break;
}
}catch(e:Error){
trace ("ローカルへの書き込みが失敗した");
}
}catch(e:Error){
}
■確認用のダイアログの結果を取得する
確認用ダイアログの結果を取得するには、NetStatusEvent.NET_STATUS イベントを使用します。
コールバック関数の引数から、NetStatusEvent オブジェクトが得られます。
info プロパティから、情報オブジェクトが得られます。
情報オブジェクトの code プロパティから、以下の文字列が得られます。
code プロパティ | 説明 |
"SharedObject. | ユーザーが許可したので、flush() は成功した |
"SharedObject. | ユーザーが拒否したので、flush() は失敗した |
NET_STATUS イベントを使って、確認用ダイアログの結果を取得する
import flash.net.SharedObject;
import flash.net.SharedObjectFlushStatus;
import flash.events.NetStatusEvent;
try{
// ------------------------------------------------------------
// 共有オブジェクトを作成する
// ------------------------------------------------------------
var shared_obj:SharedObject = SharedObject.getLocal("my_data");
// ------------------------------------------------------------
// 確認ダイアログの結果を取得するイベント
// ------------------------------------------------------------
shared_obj.addEventListener (NetStatusEvent.NET_STATUS , function(e:NetStatusEvent):void{
// 情報オブジェクトを取得する
var info:Object = e.info;
switch(info.code){
case "SharedObject.Flush.Success":
trace("ユーザーが許可したのでフラッシュは成功した");
break;
case "SharedObject.Flush.Failed":
trace("ユーザーが拒否したのでフラッシュは失敗した");
break;
}
});
// ------------------------------------------------------------
// 共有オブジェクトにデータを書き込む
// ------------------------------------------------------------
shared_obj.data.key0 = "書き込みテスト";
shared_obj.data.key1 = 123456;
shared_obj.data.key2 = ["a","b","c","d","e"];
shared_obj.data.key3 = { a:0 , b:1 , c:2 };
try{
// ------------------------------------------------------------
// 共有オブジェクトをフラッシュする
// ------------------------------------------------------------
var status:String = shared_obj.flush();
// ------------------------------------------------------------
// フラッシュの結果
// ------------------------------------------------------------
switch(status){
case SharedObjectFlushStatus.PENDING:
trace ("ユーザーに確認用のダイアログを表示した");
break;
case SharedObjectFlushStatus.FLUSHED:
trace ("ローカルへの書き込みが成功した");
break;
}
}catch(e:Error){
trace ("ローカルへの書き込みが失敗した");
}
}catch(e:Error){
}
■共有オブジェクトのフォーマットを設定する
■共有オブジェクトのフォーマットの種類について
Action Message Format 形式には、以下の種類があります。
デフォルトは、AMF3 です。
AMF0 を指定した場合、Flash 8 以前とストレージを共有できます。
定数 | 値 | 説明 |
ObjectEncoding. | 0 | AMF フォーマット(ActionScript 1.0 ~ 2.0 世代) |
ObjectEncoding. | 3 | AMF フォーマット(ActionScript 3.0 世代) |
■現在のフォーマットを設定する
objectEncoding プロパティを使用します。
ObjectEncoding.* 定数をセットします。
現在のフォーマットを設定する
import flash.net.SharedObject;
import flash.net.ObjectEncoding;
try{
// ------------------------------------------------------------
// 共有オブジェクトを作成する
// ------------------------------------------------------------
var shared_obj:SharedObject = SharedObject.getLocal("my_data");
// ------------------------------------------------------------
// 現在のフォーマットを設定する
// ------------------------------------------------------------
shared_obj.objectEncoding = ObjectEncoding.AMF0;
}catch(e:Error){
}
■デフォルトのフォーマットを設定する
この設定は、共有オブジェクトを作成するより前に済ませておく必要があります。
共有オブジェクトのデフォルトのフォーマットを設定する
import flash.net.SharedObject;
import flash.net.ObjectEncoding;
// ------------------------------------------------------------
// 共有オブジェクトのデフォルトのフォーマットを設定する
// ------------------------------------------------------------
SharedObject.defaultObjectEncoding = ObjectEncoding.AMF0;
try{
// ------------------------------------------------------------
// 共有オブジェクトを作成する
// ------------------------------------------------------------
var shared_obj:SharedObject = SharedObject.getLocal("my_data");
// ------------------------------------------------------------
// 現在のフォーマットを取得する
// ------------------------------------------------------------
trace(shared_obj.objectEncoding);
}catch(e:Error){
}
■設定ダイアログを開く表示する(ローカルストレージ用)
Security.showSettings() メソッドを使用します。
引数に SecurityPanel.LOCAL_STORAGE を指定します。
ローカルストレージ用の設定ダイアログを開く
import flash.system.Security;
import flash.system.SecurityPanel;
// ローカル記憶領域用の設定ダイアログを開く
Security.showSettings(SecurityPanel.LOCAL_STORAGE);
共有オブジェクトからデータを取得する
■共有オブジェクトからデータを取得する
data プロパティを使用します。
data プロパティの中身は、コレクション用のオブジェクトです。
ドットアクセス演算子や配列アクセス演算子を使って、読み取りアクセスします。
共有オブジェクトに書き込んだデータを取得する
import flash.net.SharedObject;
var shared_obj:SharedObject;
try{
// ------------------------------------------------------------
// 共有オブジェクトを作成する
// ------------------------------------------------------------
shared_obj = SharedObject.getLocal("my_data");
// ------------------------------------------------------------
// 共有オブジェクトにデータを書き込む(ドットアクセス演算子の場合)
// ------------------------------------------------------------
shared_obj.data.key0 = "書き込みテスト";
shared_obj.data.key1 = 123456;
shared_obj.data.key2 = ["a","b","c","d","e"];
shared_obj.data.key3 = { a:0 , b:1 , c:2 };
// ------------------------------------------------------------
// 共有オブジェクトにデータを書き込む(配列アクセス演算子の場合)
// ------------------------------------------------------------
shared_obj.data["添字0"] = "書き込みテスト";
shared_obj.data["添字1"] = 123456;
shared_obj.data["添字2"] = ["a","b","c","d","e"];
shared_obj.data["添字3"] = { a:0 , b:1 , c:2 };
// ------------------------------------------------------------
// 共有オブジェクトをフラッシュする
// ------------------------------------------------------------
shared_obj.flush();
shared_obj = null;
}catch(e:Error){
}
try{
// ------------------------------------------------------------
// 共有オブジェクトを作成する(保存データが存在する場合、読み込み処理も同時に行われる)
// ------------------------------------------------------------
shared_obj = SharedObject.getLocal("my_data");
// ------------------------------------------------------------
// 共有オブジェクトからデータを取得する(ドットアクセス演算子の場合)
// ------------------------------------------------------------
var value0:* = shared_obj.data.key0;
var value1:* = shared_obj.data.key1;
var value2:* = shared_obj.data.key2;
var value3:* = shared_obj.data.key3;
// ------------------------------------------------------------
// 共有オブジェクトからデータを取得する(配列アクセス演算子の場合)
// ------------------------------------------------------------
var value4:* = shared_obj.data["添字0"];
var value5:* = shared_obj.data["添字1"];
var value6:* = shared_obj.data["添字2"];
var value7:* = shared_obj.data["添字3"];
}catch(e:Error){
}
■リファレンス型データの読み取りに注意
Array や Object 型は、まとめて保存ができるので便利です。
これらの読み取りを行った場合、データはコピーされません。
実態は参照渡しなので、常に保存の対象となる状態に陥ります。
取得した、リファレンス型データの中身を変更すると、ストレージにも反映されてしまいます。
リファレンス型データの取得に注意
import flash.net.SharedObject;
var shared_obj:SharedObject;
try{
// ------------------------------------------------------------
// 共有オブジェクトを作成する
// ------------------------------------------------------------
shared_obj = SharedObject.getLocal("my_data");
// ------------------------------------------------------------
// 共有オブジェクトにデータを書き込む
// ------------------------------------------------------------
shared_obj.data.key = {
aaa:"保存データA",
bbb:"保存データB",
ccc:"保存データC"
};
// ------------------------------------------------------------
// 共有オブジェクトをフラッシュする
// ------------------------------------------------------------
shared_obj.flush();
shared_obj = null;
}catch(e:Error){
}
try{
// ------------------------------------------------------------
// 共有オブジェクトを作成する(保存データが存在する場合、読み込み処理も同時に行われる)
// ------------------------------------------------------------
shared_obj = SharedObject.getLocal("my_data");
// ------------------------------------------------------------
// 共有オブジェクトからデータを取得する(実態はコピーではなく参照渡し)
// ------------------------------------------------------------
var save_obj:Object = shared_obj.data.key;
// ------------------------------------------------------------
// 共有オブジェクトの参照を断つ(ここで一連の処理は完了したかのように見える)
// ------------------------------------------------------------
shared_obj = null;
// ------------------------------------------------------------
// この変更はストレージにも反映されてしまう(共有オブジェクトから参照されているため)
// ------------------------------------------------------------
save_obj.aaa = "更新A";
save_obj.bbb = "更新B";
save_obj.ccc = "更新C";
}catch(e:Error){
}
■リファレンス型データを複製する
参照を断ち切るには、リファレンス型データを複製します。
オブジェクトの複製については、こちらで解説しています。
■共有オブジェクトからデータをすべて取得する
for..in 文を使用します。
共有オブジェクトからデータをすべて取得する
import flash.net.SharedObject;
try{
// ------------------------------------------------------------
// 共有オブジェクトを作成する
// ------------------------------------------------------------
var shared_obj:SharedObject = SharedObject.getLocal("my_data");
// ------------------------------------------------------------
// コレクション用オブジェクトを取得する
// ------------------------------------------------------------
var data:Object = shared_obj.data;
// ------------------------------------------------------------
// データをすべて取得する
// ------------------------------------------------------------
var key:String;
for(key in data){
// 値を取得
var value:* = data[key];
// 出力テスト
trace('key:"' + key + '" value:' + value);
}
}catch(e:Error){
}
■共有オブジェクトの現在のバイトサイズを取得する
size プロパティを使用します。
sol ファイルに保存する、ファイルサイズに相当します。
共有オブジェクトの現在のバイトサイズを取得する
import flash.net.SharedObject;
try{
// ------------------------------------------------------------
// 共有オブジェクトを作成する
// ------------------------------------------------------------
var shared_obj:SharedObject = SharedObject.getLocal("my_data");
// ------------------------------------------------------------
// 共有オブジェクトを削除する
// ------------------------------------------------------------
shared_obj.clear();
// ------------------------------------------------------------
// 共有オブジェクトの現在のバイト数を取得する
// ------------------------------------------------------------
var byte_size0:uint = shared_obj.size;
// 出力テスト
trace(byte_size0); // 0
// ------------------------------------------------------------
// 共有オブジェクトにデータを書き込む
// ------------------------------------------------------------
shared_obj.data.key0 = "書き込みテスト";
shared_obj.data.key1 = 123456;
shared_obj.data.key2 = ["a","b","c","d","e"];
shared_obj.data.key3 = { a:0 , b:1 , c:2 };
// ------------------------------------------------------------
// 共有オブジェクトの現在のバイト数を取得する
// ------------------------------------------------------------
var byte_size1:uint = shared_obj.size;
// 出力テスト
trace(byte_size1); // 111
}catch(e:Error){
}
共有オブジェクトからデータを削除する
■共有オブジェクトからデータを削除する
data プロパティを使用します。
data プロパティの中身は、コレクション用のオブジェクトです。
delete 演算子を使って、プロパティを削除します。
すべて削除した場合、ローカルに保存されていた sol ファイルも削除されます。
共有オブジェクトからデータを削除する
import flash.net.SharedObject;
var shared_obj:SharedObject;
try{
// ------------------------------------------------------------
// 共有オブジェクトを作成する
// ------------------------------------------------------------
shared_obj = SharedObject.getLocal("my_data");
// ------------------------------------------------------------
// 共有オブジェクトにデータを書き込む
// ------------------------------------------------------------
shared_obj.data.key0 = "書き込みテスト";
shared_obj.data.key1 = 123456;
shared_obj.data.key2 = ["a","b","c","d","e"];
shared_obj.data.key3 = { a:0 , b:1 , c:2 };
// ------------------------------------------------------------
// 共有オブジェクトをフラッシュする
// ------------------------------------------------------------
shared_obj.flush();
shared_obj = null;
}catch(e:Error){
}
try{
// ------------------------------------------------------------
// 共有オブジェクトを作成する(保存データが存在する場合、読み込み処理も同時に行われる)
// ------------------------------------------------------------
shared_obj = SharedObject.getLocal("my_data");
// ------------------------------------------------------------
// 共有オブジェクトからデータを削除する(プロパティを削除する)
// ------------------------------------------------------------
delete (shared_obj.data.key0);
delete (shared_obj.data.key1);
delete (shared_obj.data.key2);
delete (shared_obj.data.key3);
// ------------------------------------------------------------
// 共有オブジェクトをフラッシュする
// ------------------------------------------------------------
shared_obj.flush();
shared_obj = null;
}catch(e:Error){
}
■共有オブジェクトを削除する
共有オブジェクトを削除するには、clear() メソッドを使用します。
ローカルに保存されていた sol ファイルも削除されます。
SharedObject.clear( ) :Void
引数 | Void | なし。 |
戻り値 | Void | なし。 |
共有オブジェクトを削除する
import flash.net.SharedObject;
try{
// ------------------------------------------------------------
// 共有オブジェクトを作成する
// ------------------------------------------------------------
var shared_obj:SharedObject = SharedObject.getLocal("my_data");
// ------------------------------------------------------------
// 共有オブジェクトを削除する
// ------------------------------------------------------------
shared_obj.clear();
}catch(e:Error){
}