在ObjectInputStream中读取Object数组时如何解决InvalidClassException?

时间:2016-01-03 19:13:25

标签: java serializable objectinputstream

我必须保存并加载国际象棋游戏。在国际象棋我有:

public class Chess 
{
private Piece[][] pieceArray;
private Board board;
private int moves;
private boolean turn;
...
Set's and get's
}

我必须加载转弯,移动和矩阵。现在我只保存并加载矩阵(Pieces [] [])

现在我有这些方法可以在另一个类中保存和加载游戏 在这个类中,我有一个连接到服务器的FTPClient。

保存游戏:

public boolean saveGame(Chess chess) {
    boolean error = false;
    try {

        File file = new File("game.save");
        FileOutputStream fis = new FileOutputStream(file);
        ObjectOutputStream oos = new ObjectOutputStream(fis);
        oos.writeObject(chess.getArray());
        oos.close();

        // Save that file in the server
        FileInputStream fis = new FileInputStream(new File("game.save"));
        client.storeFile("game.save", fis);

        fis.close();
        file.delete();


    } catch (IOException e) {

        e.printStackTrace();
    }
    return error;

保存游戏让我没有问题,顺利进行。

现在这是我用来加载游戏的方法,即抛出invalidClassException的方法。

try {
            FileInputStream fis = new FileInputStream(new File("game.save"));
            ObjectInputStream ois = new ObjectInputStream(fis);
            chess.setArray((Piece[][]) ois.readObject());
            chess.paintInBoard();
            ois.close();
        } catch (IOException | ClassNotFoundException e) {

            e.printStackTrace();
        }

每当我尝试阅读matriz时,我得到" java.io.InvalidClassException:[LPiece ;;字段"

的无效描述符

我在Piece和Chess中实现了Serializable接口。 我已经尝试保存整个Chess类但是这样做我必须在其他8个类中实现Serializable接口,我试图避免这种情况。 我是否必须单独阅读每件作品?

非常感谢你。

2 个答案:

答案 0 :(得分:1)

很难确定问题可能是什么,因为没有提供Piece接口及其实现类,但这里是我对这个问题的看法:

  1. 我个人会避免保存数组或矩阵。我会将这些片段保存在容器类中,例如:PieceCollection。
  2. 我看不到您提供的代码的任何特定问题(除非chess.getArray()返回除了pieceArray之外的其他内容)。
  3. 我认为这里的主要问题是ObjectInputStream无法区分Piece的各种实现。我建议您尝试将serialVersionUID添加到实现的Piece类中。有关详细信息,请参阅以下链接:https://docs.oracle.com/javase/7/docs/platform/serialization/spec/class.html
  4. Piece类缺少一个无参数构造函数。有关详细信息,请参阅以下链接:https://docs.oracle.com/javase/8/docs/api/index.html?java/io/InvalidClassException.html
  5. 祝你好运!我希望这个答案会对你有所帮助。

答案 1 :(得分:0)

我尝试在本地保存存储并且它有效。问题是我每次上传时使用的服务器都损坏了文件,给了我这个例外。更改服务器完成了这项工作。