Flash MX在服務(wù)器/客戶的數(shù)據(jù)處理/存儲控制上下了一些功夫,其中簡單而方便的loadVars對象我們在第二天就看到了其芳蹤,XML/XmlSocket對象還是老瓶裝舊藥,Cookie對象也不過是測試環(huán)境的犧牲品,倒是新的SharedObject對象和LocalConnection對象讓我看到Flash MX更多的閃光點,我們可以利用它們實現(xiàn)記錄網(wǎng)站訪問歷史、用戶私人信息存儲、游戲暫存/數(shù)據(jù)緩存等很多應(yīng)用。
通常,我們在Flash 5中會有幾種方法來存儲我們用過的數(shù)據(jù):如果在無Server的狀態(tài),我們可能用到FScommand+exec+EXE或者FScommand+Save+XML,適用于單機游戲和存放“Cookie”;如果有Server,則需要Loadvar/XML or XmlSocket Send連接服務(wù)器端程序?qū)懭敕?wù)器數(shù)據(jù)庫保存,但在網(wǎng)絡(luò)條件惡劣或者安全措施嚴(yán)謹(jǐn)?shù)那闆r下,這樣的方法可能造成重要數(shù)據(jù)的無法寫入;而Flash MX的SharedObject則可以減緩服務(wù)器存儲速度并有效解決此類問題。
mySO=new SharedObject(); //make a new SharedObject
SharedObject對象看起來更像是Cookie對象/MMSave方法和FScommand的Save的結(jié)合產(chǎn)物。在存儲用戶臨時數(shù)據(jù)時我們可能經(jīng)常使用到它,例如:
//main 1
i=10
while(--i){
var saveme=random(4); //change text here
var tmpData=SharedObject.getLocal("testMod");
if (tmpData.data.data==undefined || tmpData.data.data!=saveme){
trace("new data saved"+eval(tmpData.data.data=saveme)); //display & save
tmpData.flush(); //refresh data
}
trace(tmpData.data.data); //display result
trace("-------------------------------");
}
這個例子清楚地說明SharedObject的臨時數(shù)據(jù)存儲功能。首先,隨機產(chǎn)生0-3的隨機數(shù)作為待存數(shù)據(jù),然后通過SharedObject的getLocal方法讀取硬盤中文件為testMod.sol中的數(shù)據(jù),判斷內(nèi)容里面名稱為data的子值是否和待存數(shù)據(jù)相同或者根本無數(shù)據(jù),條件成立則刷新存儲構(gòu)造數(shù)據(jù)data的data值并顯示結(jié)果(“new data saved”)。
要點:
先覆蓋原值,然后flush()一次(恰如其名——沖廁所)。
*顯示當(dāng)前值,如果和原值相同,則不會顯示new data saved,即沒存入硬盤。(圖1)
(圖1)
應(yīng)用:
//prepare functions
soLoad=function(src){
return SharedObject.getLocal(src);
}
soSave=function(src,sdata){
var tmpData= SharedObject.getLocal(src);
for (var i in sdata)
tmpData.data[i]=sdata[i];
trace(tmpData.getSize());
return tmpData.flush();
}
//from Demon.S function lib SharedObject.localDeleteAll
SharedObject.prototype.localDeleteAll=function(){
for(var i in this.data)
delete this.data[i];
return this.flush();
}
//main 2
//init
var mySo="testMod";
var aryData={aritcle:"Flashmx new lighting world day10",author:"Demon.S",date:"4/8/2002",from:"DnVsystem",url:""}
//remote (src);
//local local data
var tempSO=SharedObject.getLocal(mySo);
trace("clearing....garbage:" + (tempSO.LocalDeleteAll() ? "cleaned" : "fail in clearning local data"));
//load & save
if (soSave(mySo,aryData) && aryData){
var mainData=soLoad(mySo);
if (mainData) for(var i in mainData.data) trace(i+":"+mainData.data[i]);
else trace("Fail in save ");
}
else trace("No Data");
這個例子基本上覆蓋了SharedObject的本地應(yīng)用的全部常用用法,程序開始的時候我假設(shè)不需要上次的記錄,所以我要清除那些東西,所以使用了localDeleteAll()(from Demon.S function lib)方法來清空我要寫的文件;接著判斷一些必要的糾錯,并把已經(jīng)準(zhǔn)備好的數(shù)據(jù)Object對象aryData用自定義的soSave寫入目標(biāo)mySo。
(圖2)
這樣我們就實現(xiàn)了一個簡單過程,其中g(shù)etSize方法可以獲取sharedObject的文件大小,在Flash MX的默認(rèn)是100k,但這個可以由用戶自定義,甚至無限大。
通過這個例子,我們可以把這樣的過程利用到網(wǎng)站訪問歷史、用戶私人信息存儲、游戲暫存/數(shù)據(jù)緩存等很多應(yīng)用。
存儲結(jié)構(gòu):
就好像MX的公用Include路經(jīng)一樣,SharedObject的存儲路經(jīng)也很十分的規(guī)矩:主根目錄在Application DataMacromediaFlash Player內(nèi),存放本機數(shù)據(jù)的數(shù)據(jù)都會在localhost目錄中出現(xiàn),其他網(wǎng)站的數(shù)據(jù)都會在根目錄以域名格式的文件夾出現(xiàn),例如上面我們的例子,我在桌面上做的文件就會放在:localhostDocuments and Settingsdemon.UDSDesktopday10.swf。
存儲格式不是很復(fù)雜,提取的時候按照特定的規(guī)定簡單的Split截取文件字符并打散成Object,而且數(shù)據(jù)雖然沒有加密,但這樣可以加快提取速度。
存儲極限:
在Flash MX中引入的Settings面板有效的解決了部分安全問題,可由用戶自己控制Camera和Microphone并可控制SharedObject的大小,方法:
System.showSettings(1);
源文件下載:
/tutorial/flash_mx/day10.exe
Tips:
System.showSettings()的用法:
System.showSettings(0) //顯示Microphone/Camera允許控制;
System.showSettings(1) //顯示SharedObject存儲限制;
System.showSettings(2) //顯示Microphone控制;
System.showSettings(3) //顯示Camera控制。
若超出0-3范圍時,例如負(fù)數(shù)和大于3的數(shù)則會Return錯誤,并保持上次showSettings()的狀態(tài)。