Не могу сериализовать ArrayList - PullRequest
0 голосов
/ 20 марта 2011

Это продолжение Сериализация вектора

Я пытаюсь реализовать загрузку и сохранение для игры, над которой я работаю.

Я хочу сохранить Maze, который содержит, помимо прочих атрибутов, ArrayList из Entity.

Сущность - суперкласс для Дракона, Героя и Предмета. Все три из этих типов могут содержаться одновременно в векторе.

Использование «автоматического» механизма сериализации (добавление implements Serializable к Maze) сохраняет все атрибуты, кроме ArrayList.

Почему это происходит?

Ради полноты ниже приведен мой код.

package logic;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

public final class LoadAndSave {
    public static final transient boolean available = false;

    public static final boolean serialize(Object obj) {

        // Write to disk with FileOutputStream
        FileOutputStream saveFile;
        try {
            saveFile = new FileOutputStream("game.sav");
        } catch (FileNotFoundException e) {
            return false;
        }

        // Write object with ObjectOutputStream
        ObjectOutputStream objOut;
        try {
            objOut = new ObjectOutputStream(saveFile);
        } catch (IOException e) {
            //
            return false;
        }

        // Write object out to disk
        try {
            objOut.writeObject(obj);
        } catch (IOException e) {
            return false;
        }

        return true;
    }

    public static final Object load() {
        FileInputStream fileIn;
        try {
            fileIn = new FileInputStream("game.sav");
        } catch (FileNotFoundException e1) {
            return null;
        }

        // Read object using ObjectInputStream
        ObjectInputStream objIn;
        try {
            objIn = new ObjectInputStream(fileIn);
        } catch (IOException e) {
            return null;
        }

        // Read an object
        Object obj;
        try {
            obj = objIn.readObject();
        } catch (IOException e) {
            return null;
        } catch (ClassNotFoundException e) {
            return null;
        }

        return obj;
    }

}

Ответы [ 3 ]

6 голосов
/ 20 марта 2011

Сериализуется ли Entity тоже?(вы упомянули, что только Maze сериализуем).

И убедитесь, что список не определен как transient или static , иначе он будет пропущен при сериализациимеханизм.

1 голос
/ 20 марта 2011

Я проверил Ваш код со следующими предположениями:

class Entity implements Serializable {}

и

private char[][] mazeWalls = new char[0][0];

private Vector<Entity> entities = new Vector<Entity>();

... и он отлично работает, сериализует и десериализует пустые Entity объекты ...

1 голос
/ 20 марта 2011

Вы должны убедиться, что закрыли свои потоки. Ваш код для load () можно упростить, чтобы он выглядел примерно так:

ObjectInputStream objIn = null;
try {
    objIn = new ObjectInputStream(new FileInputStream("game.sav"));
    return objIn.readObject();
} catch (Exception exception) {
    // Deal with errors
    return null;
} finally {
    if (objIn != null) {
        try {
            objIn.close();
        } catch (Exception exception) {}
    }
}

serialise () можно изменить аналогичным образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...