无法序列化ArrayList

时间:2011-03-20 10:32:16

标签: java class serialization collections arraylist

这是Serializing a vector

的后续内容

我正在尝试为我正在制作的游戏实施加载和保存。

我想保存一个Maze,其中包含ArrayList Entity的其他属性。

实体是Dragon,Hero和Item的超级类。所有这三种类型都可以一次包含在载体中。

使用“自动”序列化机制(将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 个答案:

答案 0 :(得分:6)

Entity是否也可序列化? (你提到只是迷宫是可序列化的。)

确保列表未定义为瞬态静态,否则序列化机制将跳过该列表。

答案 1 :(得分:1)

您需要确保关闭流。您的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()可以用类似的方式改变。

答案 2 :(得分:1)

我使用以下假设检查了您的代码:

class Entity implements Serializable {}

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

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

...它完美地工作,序列化和反序列化空Entity个对象......