【问题标题】:Can't serialize an ArrayList无法序列化 ArrayList
【发布时间】:2011-07-19 01:59:39
【问题描述】:

这是Serializing a vector的后续行动

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

我想保存一个Maze,其中包含ArrayListEntity 等属性。

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;
    }

}

【问题讨论】:

  • 愚蠢的问题,但是您是否也将implements Serializable添加到Entity?对于要序列化的列表,列表中的所有对象(以及所有对象中的所有非原始字段)都必须实现Serializable

标签: java class serialization collections arraylist


【解决方案1】:

Entity 也可以序列化吗? (你提到只有 Maze 是可序列化的)。

并且确保列表没有被定义为transientstatic,否则会被序列化机制跳过。

【讨论】:

  • Ii 在 Class 定义中是硬编码的,所以它已经被定义序列化了。当然,序列化器和反序列化器的类定义版本必须相同
  • 问题是 List 实例是可变的。您所说的仅适用于不可变常量。
  • 尽管这个帖子很旧,但这为我提供了完美的答案。 "静态对象被序列化机制跳过"
【解决方案2】:

我根据以下假设检查了您的代码:

class Entity implements Serializable {}

和:

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

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

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

【讨论】:

    【解决方案3】:

    您需要确保关闭您的信息流。您的 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() 可以以类似的方式进行更改。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-29
      • 2011-09-05
      • 1970-01-01
      • 1970-01-01
      • 2011-07-08
      • 2013-05-07
      • 2012-02-05
      • 1970-01-01
      相关资源
      最近更新 更多