我正在处理应用程序,我需要将AS3对象保存到数据库。 这就是我正在做的事情:
private function getComplete(e:Event)
{
var getVars:URLVariables = new URLVariables(unescape(e.target.data));
var _saveData_obj = readObjectFromStringBytes( getVars.saveData);
// do something with the save data....
}
public function SaveGame() {
var _save_data:Object = _puzzle.dataForSaving;
var _serialized_string = escape(serializeToString(_save_data));
var _round_time = Math.round( _elapsed_time);
var _token = MD5.hash( _id +
_difficulty +
"mysomewhatsecretstringhere" +
_round_time );
var request:URLRequest =
new URLRequest( _home + 'savegame.php' );
request.method = URLRequestMethod.POST;
var variables:URLVariables = new URLVariables();
variables.saveData = _serialized_string;
variables.time = _round_time;
variables.id = _id;
variables.dif = _difficulty;
variables.token = _token;
request.data = variables;
var loader:URLLoader = new URLLoader (request);
loader.addEventListener(Event.COMPLETE, postComplete);
loader.dataFormat = URLLoaderDataFormat.TEXT;
loader.load(request);
}
public function LoadGame() {
var request:URLRequest =
new URLRequest( _home + 'loadgame.php?id='+_id+"&dif="+_difficulty);
request.method = URLRequestMethod.GET;
var loader:URLLoader = new URLLoader (request);
loader.addEventListener(Event.COMPLETE, getComplete);
loader.addEventListener(IOErrorEvent.IO_ERROR, netError);
loader.dataFormat = URLLoaderDataFormat.TEXT;
loader.load(request);
}
public static function serializeToString(value:Object):String{
if(value==null){
throw new Error("null isn't a legal serialization candidate");
}
var bytes:ByteArray = new ByteArray();
bytes.writeObject(value);
bytes.position = 0;
trace ("Saved: "+bytes.length);
var be:String = Base64.encodeByteArray(bytes);
return be;
}
public static function readObjectFromStringBytes(value:String):Object {
var result:ByteArray=Base64.decodeToByteArray( value) as ByteArray;
result.position = 0;
var the_obj:Object = result.readObject();
return the_obj
}
问题是当我尝试从Base64字符串中读取对象时,我不断收到“提供的索引超出范围”错误....我检查了保存的字符串和加载的字符串是否相同。试图将Base64字符串保存到共享对象并检索它 - 这很好......唯一的问题是当我保存并加载到服务器或从服务器加载时。
你能帮助我吗?我做错了什么?感谢。
答案 0 :(得分:1)
答案 1 :(得分:0)
好的,所以看起来我们已经采取了一系列措施来调试正在进行的工作。
unescape( variables ).saveData == _puzzle.dataForSaving
。如果这不起作用,那么您的问题是escape
或unescape
。我必须承认
POST
转义数据(as3crypto的Base 64编码只返回其中一个字符:ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=
。这些都是在POST中合法)你的URLLoader应该把它作为一个合法的请求,所以我很难看到它的需要。escape
和unescape
接受字符串作为参数并返回字符串会更加一致(也更令人期待)。$_SESSION
(或者,如果可能的话,只回显值)。这将消除PHP作为可能的罪魁祸首。$_POST['saveData'] == /* whatever you echo */
。如果不是,那么您有DB编码问题。您需要确保MySQL中使用的任何编码与AS中使用的编码相同。另外,在使用AS时,您会发现使用$_REQUEST
代替$_POST
或$_GET
更容易。由于请求或多或少是抽象的,因此AS的URLRequests并不需要担心RESTful,并且使用POST
只比使用它更容易。