flash mx – 新的闪烁世界(第十天)
炎热的夏天正在悄然地袭击着容易受伤的深圳,导致本魔中午外出觅食的时候竟然都睁不开眼睛……紧张之后新周一也没什么事情可做,这个时候不写点东西才叫浪费青春。
flash mx中在服务器/客户的数据处理/存储控制上下了一些功夫。简单而方便的loadvars对象我们在第二天就看到了其芳踪,xml/xmlsocket对象还是老瓶装旧药,cookie对象也不过是测试环境的牺牲品,倒是新的sharedobject对象和localconnection对象让我看到mx闪亮的万丝千屡一瞬间(头发丝的高光部)。
通常,我们在flash 5会有几种方法来存储我们用过的数据:如果在无server的状态,我们可能用到fscommand+exec+exe或者fscommand+save+xml,适用于单机游戏和存放“cookie”;如果存在server,那么需要loadvar/xml or xmlsocket send连接服务器端程序写入服务器数据库保存,但在网络条件恶劣或者安全措施严谨的情况下,这样的方法可能造成重要数据的无法写入;而flash mx的sharedobject则可以减缓服务器存储速度并有效解决此类问题。
myso=new sharedobject(); //make a new sharedobject
sharedobject对象看起来更像是cookie对象/mmsave方法和fscommand的save的结合产物。在存储用户临时数据时我们可能经常使用到它,例如:
//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的临时数据存储功能。首先,随机产生0-3的随机数作为待存数据,然后通过sharedobject的getlocal方法读取硬盘中文件为testmod.sol中的数据,判断内容里面名称为data的子值是否和待存数据相同或者根本无数据,条件成立则刷新存储构造数据data的data值并显示结果(“new data saved”)。
要点:
先覆盖原值,然后flush()一次(就好像其名——冲厕所)。
最后显示当前值,如果和原值相同,则不会显示new data saved,即没存入硬盘。(也没必要)(图1)
(图1,来个图,否则某些人会说不玩罗,程序好枯燥哦~……)
应用:
//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:"http://www.dnvs.net"}
//remote one:sharedobject.deleteall(src);
//local one:clearn 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的本地应用的全部常用用法,程序开始的时候我假设不需要上次的记录,所以我要清除那些东西,所以使用了localdeleteall()(from demon.s function lib)方法来清空我要写的文件;接着判断一些必要的纠错,并把已经准备好的数据object对象arydata用自定义的sosave写入目标myso。
(图2)
这样我们就实现了一个简单过程,其中getsize方法可以获取sharedobject的文件大小,在flash mx的默认是100k,但这个可以由用户自定义,甚至无限大。
通过这个例子,我们可以把这样的过程利用到网站访问历史、用户私人信息存储、游戏暂存/数据缓存等很多应用
存储结构:
就好像mx的公用include路经一样,sharedobject的存储路经也很十分的规矩:主根目录在application data\macromedia\flash player\内,存放本机数据的数据都会在localhost目录中出现,其他网站的数据都会在根目录以域名格式的文件夹出现,例如上面我们的例子,我在桌面上做的文件就会放在:localhost\documents and settings\demon.uds\desktop\day10.swf。
存储格式不是很复杂,提取的时候按照特定的规定简单的split截取文件字符并打散成object,而且数据虽然没有加密,但这样可以加快提取速度。
存储极限:
在flash mx中引入的settings面板有效的解决了部分安全问题,可由用户自己控制camera和microphone并可控制sharedobject的大小,方法:
system.showsettings(1);
啊,一口气狂打出来,手指都麻了……sharedobject,i love this shit!最后,插点广告:dreamworks的最新动画大片spirit就要出世,其官方网站是我leading的超级无敌邪恶无比flash必死恶魔组负责制作:http://www.dreamworks.com/spirit,制作过程中深感此片还算不错,所以大家也到时捧场买一张电影片看下:)。
源文件下载:
http://www.dnvs.net/tutorial/flash_mx/day10.exe
http://www.fei7.com/demons/fla/day10.zip
tips:
system.showsettings()的用法:
system.showsettings(0) //显示microphone/camera允许控制;
system.showsettings(1) //显示sharedobject存储限制;
system.showsettings(2) //显示microphone控制;
system.showsettings(3) //显示camera控制。
若超出0-3范围时,例如负数和大于3的数则会return错误,并保持上次showsettings()的状态
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器