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

Posted

技术标签:

【中文标题】在ObjectInputStream中读取Object数组时如何解决InvalidClassException?【英文标题】:How to solve InvalidClassException when reading an Object array in ObjectInputStream? 【发布时间】:2016-04-07 10:30:29 【问题描述】:

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

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 接口,我正试图避免这种情况。 我必须单独阅读每篇文章吗?

非常感谢。

【问题讨论】:

【参考方案1】:

由于没有提供 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

祝你好运!希望这个回答对你有帮助。

【讨论】:

【参考方案2】:

我尝试将存档保存在本地,并且成功了。问题是我使用的服务器每次上传文件时都会损坏文件,给我这个例外。更改服务器就可以了。

【讨论】:

以上是关于在ObjectInputStream中读取Object数组时如何解决InvalidClassException?的主要内容,如果未能解决你的问题,请参考以下文章

java使用ObjectInputStream从文件中读取对象

ObjectInputStream 不多次读取

为啥我使用 ObjectInputStream 一次只能读取 1024 个字节?

Android - 即使使用 .reset(),ObjectInputStream 也会继续读取先前的值

Android:读取arraylist时ObjectInputStream抛出ClassCastException

ObjectInputStream 没有找到任何要提取的数据?