トップへ戻るニュースフォーラムFLASH-ML 過去ログBak@Flaダウンロードよくある質問と答
ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   コーダーズルーム【スクリプト系】
     SharedObjectで任意のデータを保存したい
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
piemaru
Åê¹ÆNo.44014
投稿日時: 2009-11-26 0:42
半人前
居住地: さいたま
投稿: 46
使用環境:
OS: WinXP
Flashバージョン:8,CS3
SharedObjectで任意のデータを保存したい
SharedObjectを利用して任意のデータを保存したいのですが、一度保存すると、その後データをいじるとSharedObjectの方のデータも変わってしまいます。これを避けるにはどうしたらよろしいでしょうか?

var mySO:SharedObject = SharedObject.getLocal("artBox");
public function saveData():void {

						mySO.data.dataAry_SO = dataAry;
			
			try {
				switch (mySO.flush()) {
					case SharedObjectFlushStatus.FLUSHED :
						trace("セーブしました。");
						break;
					case SharedObjectFlushStatus.PENDING :
						break;
				}
			} catch (e:Error) {

			}
		}


このようにセーブしていますが、この「saveData()」を一度実行すると、その後、「dataAry」の中身が変化すると、「mySO.data.dataAry_SO」も変わってしまいます。
これを回避することはできますでしょうか?

ご教示いただければ幸いです。
よろしくお願いいたします。


----------------
PIEMARU”(  ´  ▽  `  )ノ”

エレQ
Åê¹ÆNo.44018
投稿日時: 2009-11-26 20:09
新米
居住地:
投稿: 14
使用環境:
WinXP〜7,Flash MX〜CS4
Re: SharedObjectで任意のデータを保存したい
Shared Objectに限らず、ActionScriptで = で配列やオブジェクトを代入すると、なぜか以後、連動して値が変わってしまうようです。私も以前ハマりました。。。

例えば、まるごと入れ替えでよいなら、


//いったん消して
mySO.data.dataAry_SO = new Array();
//1つずついれこむ
for(cnt in dataAry){
 mySO.data.dataAry_SO[cnt] = dataAry[cnt];
}


という感じで、たぶん回避できるかと思います。
piemaru
Åê¹ÆNo.44180
投稿日時: 2009-12-24 18:08
半人前
居住地: さいたま
投稿: 46
使用環境:
OS: WinXP
Flashバージョン:8,CS3
Re: SharedObjectで任意のデータを保存したい
>elephan_cさま

お礼が大変遅くなり、申し訳ございません。

ご教示の方法で、なんとかなりそうです。
ありがとうございました。


----------------
PIEMARU”(  ´  ▽  `  )ノ”

nekoyuki
Åê¹ÆNo.44188
投稿日時: 2009-12-25 11:28
半人前
居住地: 大阪府
投稿: 48
使用環境:
FLASH CS3 Professional
XP Pro(SP2)
Re: SharedObjectで任意のデータを保存したい
ASでは配列、オブジェクトのイコールの式は
リファレンス送りになってしまいます。
配列、オブジェクトのコピーを作るには
下記の様にByteArrayクラスを使うと出来ますよ

 

var mySO:SharedObject = SharedObject.getLocal("artBox");
public function saveData():void {

						mySO.data.dataAry_SO = copy(dataAry);
			
			try {
				switch (mySO.flush()) {
					case SharedObjectFlushStatus.FLUSHED :
						trace("セーブしました。");
						break;
					case SharedObjectFlushStatus.PENDING :
						break;
				}
			} catch (e:Error) {

			}
		}

function copy(from:*):*
	{
		var byteArr:ByteArray = new ByteArray();
		byteArr.writeObject(from);
		byteArr.compress();
		byteArr.uncompress();
		return byteArr.readObject();
	}


Tonpoo (gaienboy改め)
Åê¹ÆNo.44189
投稿日時: 2009-12-25 13:08
職人
居住地: 東京・神宮前
投稿: 713
使用環境:
Windows Vista SP1,
Flash CS3 Pro,
Flash Player 10.0.22.87
Re: SharedObjectで任意のデータを保存したい
gaienboyです。横レスすいません。ByteArrayクラスというのをnekoyukiさんの
投稿で初めて知りました!配列のコピーにも使えていいですね。早速ちょっと試さ
せてもらいました。ByteArray.compress→ByteArray.uncompressしないとでき
ないんですね。nekoyukiさん、ありがとうございました。

TONPOOBLOG » ByteArrayクラスを使って配列やオブジェクトのコピーを生成する


----------------
Tonpoo (a.k.a. gaienboy)
Tonpoo.com / TONPOOBLOG / twitter@tonpootwit

野中文雄
Åê¹ÆNo.44190
投稿日時: 2009-12-25 13:40
ちょんまげら
居住地: 東京
投稿: 4247
使用環境:
CS4 .4.11 Vista Home Premium (SP1)
Re: SharedObjectで任意のデータを保存したい
ByteArray.readObject()メソッドの呼出し前に、ByteArray.positionプロパティを0にしたのではだめですか?
引用:
gaienboyさんは書きました:
gaienboyです。横レスすいません。ByteArrayクラスというのをnekoyukiさんの
投稿で初めて知りました!配列のコピーにも使えていいですね。早速ちょっと試さ
せてもらいました。ByteArray.compress→ByteArray.uncompressしないとでき
ないんですね。nekoyukiさん、ありがとうございました。

TONPOOBLOG » ByteArrayクラスを使って配列やオブジェクトのコピーを生成する


----------------
 

Tonpoo (gaienboy改め)
Åê¹ÆNo.44192
投稿日時: 2009-12-25 14:05
職人
居住地: 東京・神宮前
投稿: 713
使用環境:
Windows Vista SP1,
Flash CS3 Pro,
Flash Player 10.0.22.87
Re: SharedObjectで任意のデータを保存したい
gaienboyです。仰るとおり、ByteArray.positionを0にしたらうまくいきました!
ブログ記事の方も訂正してます。ご指摘ありがとうございました!

TONPOOBLOG » ByteArrayクラスを使って配列やオブジェクトのコピーを生成する


----------------
Tonpoo (a.k.a. gaienboy)
Tonpoo.com / TONPOOBLOG / twitter@tonpootwit

スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を
 
Copyright (C) 2003 FLASH-japan. All rights reserved.
Powered by Xoops