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

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


每当我尝试读取矩阵时,都会得到“ java.io.InvalidClassException:[LPiece ;;字段的无效描述符”

我已经在Piece and Chess中实现了Serializable接口。
我曾尝试保存整个Chess类,但是这样做还必须在其他8个类中实现Serializable接口,而我试图避免这种情况。
我需要分别阅读每篇文章吗?

非常感谢。

最佳答案

由于未提供Piece接口及其实现类,因此很难确定可能是什么问题,但是我对这个问题的想法如下:


我个人将避免保存数组或矩阵。相反,我会将片段保存在容器类中,例如:PieceCollection。
我看不到您提供的代码有任何特定的问题(除非Chess.getArray()返回的不是pieceArray)。
我相信这里的主要问题是ObjectInputStream无法区分Piece的各种实现。我建议您尝试将serialVersionUID添加到实现的Piece类中。有关更多信息,请参见以下链接:https://docs.oracle.com/javase/7/docs/platform/serialization/spec/class.html
Piece类缺少无参数构造函数。有关更多信息,请参见以下链接:https://docs.oracle.com/javase/8/docs/api/index.html?java/io/InvalidClassException.html


祝好运!希望这个答案对您有所帮助。

关于java - 在ObjectInputStream中读取Object数组时,如何解决InvalidClassException?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34580514/

10-12 02:36