Java 无法序列化ArrayList

Java 无法序列化ArrayList,java,class,serialization,collections,arraylist,Java,Class,Serialization,Collections,Arraylist,这是一个后续行动 我正在尝试为我正在开发的游戏实现加载和保存 我想保存一个迷宫,其中包含实体的ArrayList,以及其他属性 实体是龙、英雄和物品的超类。这三种类型都可以同时包含在向量中 使用自动序列化机制,将实现Serializable添加到Maze将保存除ArrayList之外的所有属性 为什么会发生这种情况 为了完整起见,我的代码如下 package logic; import java.io.FileInputStream; import java.io.FileNotFoundEx

这是一个后续行动

我正在尝试为我正在开发的游戏实现加载和保存

我想保存一个迷宫,其中包含实体的ArrayList,以及其他属性

实体是龙、英雄和物品的超类。这三种类型都可以同时包含在向量中

使用自动序列化机制,将实现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;
    }

}
实体也可序列化吗?您提到了just Maze是可序列化的


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

您需要确保关闭流。加载代码可以简化为如下所示:

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可以用类似的方式进行更改。

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

class Entity implements Serializable {}
以及:


…它工作得很好,序列化和反序列化空实体对象…

愚蠢的问题,但您是否也添加了可序列化到实体的实现?对于要序列化的列表,列表中的所有对象以及所有对象中的所有非原语字段都必须实现Serializable。Ii在类定义中是硬编码的,因此它已按定义序列化。当然,序列化程序和反序列化程序的类定义版本必须相同。问题是列表实例是可变的。你所说的只适用于不可变常数。即使这个线程很旧,这也为我提供了完美的答案。序列化机制跳过静态对象
private char[][] mazeWalls = new char[0][0];

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