Groups | Blog | Home
all groups > flash actionscript > february 2007 >

flash actionscript : Shared Object question


GlennZim
2/6/2007 7:08:26 PM
I use shared objects a lot and I've run into a problem. When saving an array
into a local shared object, if the array is changed, it automatically changes
in the shared object when the swf is exited. For example:

// ----- create a shared object ----- //
var cSaved:SharedObject = SharedObject.getLocal("test","/");

// ----- create an object, an array, and a numeric variable ----- //
var anobject:Object = new Object();
anobject.aname = "bob";
var anarray:Array = new Array(0,1,2,3,4);
var anum:Number = 100;

// ----- save this info to the shared object ----- //
cSaved.data.thisobject = anobject;
cSaved.data.thisnum = anum;
cSaved.data.thisarray = anarray;
cSaved.flush();

// ----- change the values of the variables ----- //
anobject.aname = "willie";
anum = 50;
anarray[3] = 100;

// ----- check the values in the shared object. They changed! ----- //
trace(cSaved.data.thisobject.aname);
trace(cSaved.data.thisarray);

stop()

In the above code, when I changed the value of anarray[3] to 100, it
automatically changed the value of cSaved.data.thisarray. However, changing
the value of anum does NOT change the value of cSaved.data.thisnum when exiting
the swf.

Is there a way to stop arrays saved in a shared object from updating like
this? It does it with objects too. Thanks.

-Glenn-



// ----- create a shared object ----- //
var cSaved:SharedObject = SharedObject.getLocal("test","/");

// ----- create an object, an array, and a numeric variable ----- //
var anobject:Object = new Object();
anobject.aname = "bob";
var anarray:Array = new Array(0,1,2,3,4);
var anum:Number = 100;

// ----- save this info to the shared object ----- //
cSaved.data.thisobject = anobject;
cSaved.data.thisnum = anum;
cSaved.data.thisarray = anarray;
cSaved.flush();

// ----- change the values of the variables ----- //
anobject.aname = "willie";
anum = 50;
anarray[3] = 100;

trace(cSaved.data.thisobject.aname);
trace(cSaved.data.thisarray);

stop()
abeall
2/6/2007 7:26:00 PM
There area a couple of different things that can make this confusing:

First, there is a difference between creating a copy, and creating a
reference. Specifically, Numbers, Strings, and Booleans are primitive values,
so when you do this: myVar1 = myVar2, it basically copies the value of myVar2
into a new variable, named myVar1. However, complex data types, such as Arrays
and generic Objects, do not copy the value, but rather create a reference. So
when you do myArr1 = myArr2, you are just creating another reference named
myArr1 to the same Array, which is referenced to by myArr2.

Solution is to copy the array. There is not Array.clone() method, but you can
effectively do it like this:
myClonedArr = myArr.slice();

Second, a SharedObject is automatically flushed when the client is closed. The
only thing that SharedObject.flush() does for you is prompt the user for more
disk space if the Player needs more than the default 100K.

HTH
GlennZim
2/6/2007 8:12:50 PM
Thanks for the explanation. It doesn't make my life any easier, but it is good
to know why the shared object does what it does!

I did find a workaround for the array problem by first using .join("-") to
group everything together into one string when saving, and then using
..split("-") to break it back apart when retrieving. Saving objects, however,
will be a little trickier.

Thanks again,
-Glenn-

AddThis Social Bookmark Button