Так что в последнее время я боролся с инструментами сериализации 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();
}
Любая помощь или комментарии были бы весьма признательны.
Когда я меняю путь к файлу на локальный, файл, похоже, не создается, потому что, когда я вызываю Gdx.files.local (myfile) .exists(), он всегда возвращает false на android, где, как и на компьютере, он отлично работает хорошо. Я не получаю ошибок, но он просто воссоздает файл, даже если я уже пытался сохранить его в предыдущем экземпляре. – bhafenri
Это странно. Что делает 'Gdx.files.local (myfile) .getLocalStoragePath()' show? Кроме того, содержит ли имя myfile какие-либо слэши (разделители каталогов)? Может быть, время для нового/отдельного вопроса. –
У меня нет метода, называемого .getlocalstoragepath(), когда я вызываю Gdx.files.local («player.dat»), для Gdx.files.local.getlocalstoragepath() он возвращает «data/data/com.me» .Asteroids/files/"если это помогает – bhafenri