AS3 ByteArray «Указанный индекс выходит за границы» Ошибка - PullRequest
0 голосов
/ 07 августа 2011

Я работаю над приложением, и мне нужно сохранить объект 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 ]

1 голос
/ 07 августа 2011

попробуйте использовать ba.writeMultiByte(string, 'utf-8') и ba.readMultiByte(ba.bytesAvailable, 'utf-8') без преобразования в объект

0 голосов
/ 08 августа 2011

Хорошо, похоже, мы подошли к серии шагов, которые вы можете предпринять, чтобы отладить происходящее.

  1. (в сохраненной игре) убедитесь, что unescape( variables ).saveData == _puzzle.dataForSaving. Если это не работает, то ваша проблема связана с escape или unescape. я должен признать
    • Я подозреваю, что вам никогда не нужно экранировать данные для POST после того, как они были закодированы в Base64 (кодировка Base 64 as3crypto вернет только один из следующих символов: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=. Все они допустимы в POST ) и ваш URLLoader должен позаботиться о том, чтобы сделать его законным запросом, поэтому мне трудно понять, в чем он нуждается.
    • Более логично (и более ожидаемо), чтобы escape и unescape принимали строки в качестве параметров и возвращали строки.
  2. Вместо сохранения в базе данных и последующего извлечения, сохраните в $_SESSION (или, если возможно, просто верните значение обратно). Это исключит PHP как возможного виновника.
  3. В PHP убедитесь, что $_POST['saveData'] == /* whatever you echo */. Если это не так, то у вас проблема с кодировкой БД. Вы должны убедиться, что любая кодировка, используемая в MySQL, совпадает с кодировкой, используемой в AS.

Кроме того, при работе с AS вам часто будет проще использовать $_REQUEST вместо $_POST или $_GET. Поскольку запросы более или менее абстрагированы, URLRequests AS на самом деле не нужно беспокоиться о том, чтобы быть RESTful, и работать с ним намного проще, чем с использованием исключительно POST s.

...