2013-07-24 5 views
2

Так что в последнее время я боролся с инструментами сериализации Libgdx. В настоящее время я пытаюсь записать как мой класс игрока, так и класс GameEntry в файл, к которому я могу получить доступ позже, когда пользователь покидает приложение. Мой текущий метод прекрасно работает на компьютерной версии моего приложения, но когда дело доходит до платформы Android, у него не было такого же успеха. Я добавил в свой манифест, но я все еще получаю следующие ошибки.Libgdx - Serialization Platform Issue

com.badlogic.gdx.utils.GdxRuntimeException: Error writing file: player.dat (Absolute) 

И затем возникает следующая ошибка, которая приводит к сбою игры.

com.badlogic.gdx.utils.GdxRuntimeException: Error reading file: scores.dat (Absolute) 

Вот код этой части игры. Я вызываю методы сохранения и чтения в методе create() в зависимости от того, обнаружена ли платформа этими файлами.

public static void saveFile(ArrayList<GameEntry> scores) throws IOException{   
    FileHandle file = Gdx.files.absolute("scores.dat"); 
    OutputStream out = null; 
    try{ 
     file.writeBytes((serialize(scores)), false); 
    }catch(Exception ex){ 

    }finally{ 
     if(out != null) try{out.close();} catch(Exception ex){} 
    } 

    Gdx.app.log(Asteroids.LOG, "Saving File: " + scores.toString()); 
} 

public static void savePlayer(Player player) throws IOException{   
    FileHandle file = Gdx.files.absolute("player.dat"); 
    PlayerData playerData = new PlayerData(player); 
    OutputStream out = null; 
    try{ 
     file.writeBytes((serialize(playerData)), false); 
    }catch(Exception ex){ 
     Gdx.app.log(Asteroids.LOG, ex.toString()); 
    }finally{ 
     if(out != null) try{out.close();} catch(Exception ex){} 
    } 

    Gdx.app.log(Asteroids.LOG, "Saving Player"); 
} 

@SuppressWarnings("unchecked") 
public static ArrayList<GameEntry> readFile() throws IOException, ClassNotFoundException{ 
    FileHandle file = Gdx.files.absolute("scores.dat"); 
    scores = (ArrayList<GameEntry>) deserialize(file.readBytes()); 

    Gdx.app.log(Asteroids.LOG, "Reading File: " + scores.toString()); 
    return scores; 
} 

public static Player readPlayer() throws IOException, ClassNotFoundException{ 
    Player player = null; 
    PlayerData playerData = null; 
    FileHandle file = Gdx.files.absolute("player.dat"); 
    playerData = (PlayerData) deserialize(file.readBytes()); 

    player = new Player(new Texture(Gdx.files.internal("Ships/defaultShip.png")), new Vector2((Gdx.graphics.getWidth()/2) - 25, 50), Player.PLAYER_WIDTH,Player.PLAYER_HEIGHT); 
    player.setHealth((int) playerData.getPlayerHealth()); 
    player.setMaxHealth((int) playerData.getPlayerMaxHealth()); 
    player.setShieldHealth(playerData.getPlayerShieldHealth()); 
    player.setBulletCount(playerData.getBulletCount()); 
    player.setShieldRegenRate(playerData.getPlayerShieldRegenRate()); 
    player.setPlayerScore(playerData.getPlayerScore()); 
    player.setEntityTexture(new Texture(Gdx.files.internal(playerData.getPlayerShipName()))); 
    player.update(); 

    Gdx.app.log(Asteroids.LOG, "Reading Player"); 
    return player; 
} 

public static byte[] serialize(Object obj) throws IOException { 
    ByteArrayOutputStream b = new ByteArrayOutputStream(); 
    ObjectOutputStream o = new ObjectOutputStream(b); 
    o.writeObject(obj); 
    return b.toByteArray(); 
} 

public static Object deserialize(byte[] bytes) throws IOException, ClassNotFoundException { 
    ByteArrayInputStream b = new ByteArrayInputStream(bytes); 
    ObjectInputStream o = new ObjectInputStream(b); 
    return o.readObject(); 
} 

Любая помощь или комментарии были бы весьма признательны.

ответ

1

Вы, вероятно, не хотите использовать абсолютные (полностью квалифицированные) пути, так как строка, которая вам понадобится, различна на каждой платформе. Вероятно, вы захотите использовать Gdx.files.local() type path.

Для получения более подробной информации см. https://code.google.com/p/libgdx/wiki/FileHandling. Варианты выбора Libgdx немного сложны, потому что пересечение вариантов хранения Java/Android/Desktop/GWT/iOS является сложным.

+0

Когда я меняю путь к файлу на локальный, файл, похоже, не создается, потому что, когда я вызываю Gdx.files.local (myfile) .exists(), он всегда возвращает false на android, где, как и на компьютере, он отлично работает хорошо. Я не получаю ошибок, но он просто воссоздает файл, даже если я уже пытался сохранить его в предыдущем экземпляре. – bhafenri

+1

Это странно. Что делает 'Gdx.files.local (myfile) .getLocalStoragePath()' show? Кроме того, содержит ли имя myfile какие-либо слэши (разделители каталогов)? Может быть, время для нового/отдельного вопроса. –

+0

У меня нет метода, называемого .getlocalstoragepath(), когда я вызываю Gdx.files.local («player.dat»), для Gdx.files.local.getlocalstoragepath() он возвращает «data/data/com.me» .Asteroids/files/"если это помогает – bhafenri

1

Если вы используете абсолютный путь, чем вы должны дать полный путь как этот

FileHandle handle = Gdx.files.absolute("/some_dir/subdir/myfile.txt"); 

Вы также можете обратиться к этой ссылке для любой другой ссылки

https://code.google.com/p/libgdx/wiki/FileModule

+0

И где бы вы порекомендовали сохранить файл, если я хочу получить к нему доступ в версиях для ПК и Android? – bhafenri