AS3 ByteArray“提供的索引超出范围”错误

时间:2011-08-07 18:53:34

标签: actionscript-3 actionscript bytearray

我正在处理应用程序,我需要将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字符串保存到共享对象并检索它 - 这很好......唯一的问题是当我保存并加载到服务器或从服务器加载时。

你能帮助我吗?我做错了什么?

感谢。

2 个答案:

答案 0 :(得分:1)

答案 1 :(得分:0)

好的,所以看起来我们已经采取了一系列措施来调试正在进行的工作。

  1. (在保存游戏中)确保unescape( variables ).saveData == _puzzle.dataForSaving。如果这不起作用,那么您的问题是escapeunescape。我必须承认
    • 我在这里很怀疑,一旦它被Base64编码,你永远不需要为POST转义数据(as3crypto的Base 64编码只返回其中一个字符:ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=。这些都是在POST中合法)你的URLLoader应该把它作为一个合法的请求,所以我很难看到它的需要。
    • escapeunescape接受字符串作为参数并返回字符串会更加一致(也更令人期待)。
  2. 不是存储到数据库然后检索,而是存储到$_SESSION(或者,如果可能的话,只回显值)。这将消除PHP作为可能的罪魁祸首。
  3. 在PHP中,请确保$_POST['saveData'] == /* whatever you echo */。如果不是,那么您有DB编码问题。您需要确保MySQL中使用的任何编码与AS中使用的编码相同。
  4. 另外,在使用AS时,您会发现使用$_REQUEST代替$_POST$_GET更容易。由于请求或多或少是抽象的,因此AS的URLRequests并不需要担心RESTful,并且使用POST只比使用它更容易。