AS3 用ShareObject保存数据之后,发布成exe时不能读取数据
有什么方法可以脱离FLASH,发布出的程序移植到别的机器仍可以读取userData的数据?
请各位指教指教
var userData:SharedObject = SharedObject.getLocal("userData");
//假设二维数组为 [5][6]
var xn:Number = 5;
var yn:Number = 8;
///*-------------------------------------------
//定义用户的二维数组
var user:Array = new Array();
//填充二维数组
for (var i=0; i<xn; i++)
{
user[i] = new Array();
for (var j=0; j<yn; j++)
{
user[i][j] = 0;
}
}
user[0][0] = "no1";
user[0][1] = "123";
user[0][2] = "2";
user[1][0] = "no2";
user[1][1] = "456";
user[2][0] = "no3";
user[2][1] = "789";
user[3][0] = "no4";
user[3][1] = "012";
trace(user);
userData.data.gameinfo = user; 展开
发布成exe后读取数据失败,是因为
var userData:SharedObject = SharedObject.getLocal("userData");这句造成的,因为没有指定路径,所以每一次getLocal时,都默认成文件位置,意思就是说,如果你移动主文件位置后,会新建一个数据存储。
解决办法就是在后面加多一个参数,指定其路径,如
var userData:SharedObject = SharedObject.getLocal("userData","/");
这样,不管你的主文件移动哪个盘符,哪个文件夹里,都能读取到了。
PS:由于http的存储是在对应的域名下面的,所以会读到不同的存储位置,再者是浏览器的差异性也会导致,但同一个浏览器,同一个域名,不管什么时候打开都会读同一个存储位置的。
移植到别的电脑仍然可以读取到数据,由于是本地存储,故要实现这功能,移植时也必须将数据文件打包移植,但需要手动还原(不建议这样做)
本地存储文件一般在(AppData需要在窗口中“工具”->“文件夹选项”->“查看”,勾选上“显示隐藏的文件、文件夹和驱动器”才能看到)
C:\Users\电脑用户名(默认为:Administrator)\AppData\
下,由于不同的系统,其位置也有差异,你可以使用SharedObject来搜索又或者使用你的文件名,如上面代码中的userData,很快就会找到你专属的userData.sol文件了
移植时也带走这个文件,到被移植电脑上,在相同的存储位置上摆放此文件即可读取
注意,最好的方法就是先进行一次播放,之后在此系统中用上面的方法找到userData.sol,再用你移植的userData.sol来覆盖使用。
因为麻烦,所以才不建议,但如果需要移植本地.sol文件的话,只能这样做。
建议方法:
由于你打算使用exe了,即是不需要嵌套在网页中,所以可以考虑使用AIR,AIR中,有File类和FileStream类,可以将数据写到自定义的本地文件中,当然保存的位置是你自定义的,方便吧
假如你保存的位置为安装目录的位置上,那么你移植时,将整个包一起移走就可以在其他电脑上使用同一个数据文件了,跟移动.sol文件不同,这个数据文件不需要寻找和还原。
附上一个简单的AIR保存例子:
import flash.filesystem.*;
import flash.net.registerClassAlias;
var obj:Object = new Object();//保存的数据对象,可以为任何类
/**此句是将类进行注册,之后可以在读取时还原,在保存自定义类时非常好用,
* 因为stream.readObject得到的是一个Object,无法自动转换成自定义类。
* 所以,如果保存自定义,而想在读取时也可以还原成这个类的话,需要进行注册一次,
* 必须是在写入之前进行注册。当然,在读取时也需要进行注册才能还原。
* */
registerClassAlias("cls", Object);
var f:File = new File(File.applicationDirectory.nativePath + "/自定义文件夹路径或不加/" + "文件名.文件后辍名");//都是自定义的
var stream:FileStream = new FileStream();
try {
stream.open(f, FileMode.WRITE);//open是同步打开,即如果有程序占用文件就会打不开了
}catch (evt:Error) {
trace("文件被其他程序占用!");
return;
}
stream.writeObject(obj);
/**建议写完后,关闭文件,否则会占用*/
try {
stream.close();
}catch (evt:Error) {
trace("无法关闭文件!");
}
/**读取的时候,使用相同的方法,用stream打开文件,打开文件为READ,如*/
stream.open(f, FileMode.READ);
/**读取时*/
stream.readObject();
/**得到的是一个Object类型的数据,如果需要转换成自定义就需要注册类了,上面有提到*/
PS:感觉回答得是不是有点长了?。。。-_-!