在ObjectInputStream中读取Object数组时如何解决InvalidClassException?
How to solve InvalidClassException when reading an Object array in ObjectInputStream?
我必须保存和加载国际象棋游戏。在国际象棋中我有:
public class Chess
{
private Piece[][] pieceArray;
private Board board;
private int moves;
private boolean turn;
...
Set's and get's
}
我必须加载转弯、移动和矩阵。现在我只保存和加载矩阵 (Pieces[][])
现在我有这些方法可以在另一个 class 中保存和加载游戏
在此 class 我有一个连接到服务器的 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;; invalid descriptor for field "
我已经在Piece and Chess 中实现了Serializable 接口。
我曾尝试保存整个 Chess class,但这样做我将不得不在其他 8 个 class 中实现 Serializable 接口,而我正在努力避免这种情况。
我必须单独阅读每篇文章吗?
非常感谢。
很难确定问题可能是什么,因为未提供 Piece 接口及其实现 classes,但这是我对这个问题的看法:
- 我个人会避免保存数组或矩阵。我宁愿将碎片保存在容器 class 中,例如:PieceCollection.
- 我看不出您提供的代码有任何具体问题(除非 chess.getArray() returns 除了 pieceArray 以外的代码)。
- 我认为这里的主要问题是ObjectInputStream无法区分Piece的各种实现。我建议您尝试将 serialVersionUID 添加到实现 Piece classes 中。有关详细信息,请参阅以下 link:https://docs.oracle.com/javase/7/docs/platform/serialization/spec/class.html
- Piece classes 缺少 no-arg 构造函数。有关详细信息,请参阅以下 link:https://docs.oracle.com/javase/8/docs/api/index.html?java/io/InvalidClassException.html
祝你好运!希望这个回答对您有所帮助。
我试过在本地保存存档,结果成功了。问题是每次我上传文件时我使用的服务器都会损坏文件,这给了我那个例外。更改服务器即可完成工作。
我必须保存和加载国际象棋游戏。在国际象棋中我有:
public class Chess
{
private Piece[][] pieceArray;
private Board board;
private int moves;
private boolean turn;
...
Set's and get's
}
我必须加载转弯、移动和矩阵。现在我只保存和加载矩阵 (Pieces[][])
现在我有这些方法可以在另一个 class 中保存和加载游戏 在此 class 我有一个连接到服务器的 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;; invalid descriptor for field "
我已经在Piece and Chess 中实现了Serializable 接口。 我曾尝试保存整个 Chess class,但这样做我将不得不在其他 8 个 class 中实现 Serializable 接口,而我正在努力避免这种情况。 我必须单独阅读每篇文章吗?
非常感谢。
很难确定问题可能是什么,因为未提供 Piece 接口及其实现 classes,但这是我对这个问题的看法:
- 我个人会避免保存数组或矩阵。我宁愿将碎片保存在容器 class 中,例如:PieceCollection.
- 我看不出您提供的代码有任何具体问题(除非 chess.getArray() returns 除了 pieceArray 以外的代码)。
- 我认为这里的主要问题是ObjectInputStream无法区分Piece的各种实现。我建议您尝试将 serialVersionUID 添加到实现 Piece classes 中。有关详细信息,请参阅以下 link:https://docs.oracle.com/javase/7/docs/platform/serialization/spec/class.html
- Piece classes 缺少 no-arg 构造函数。有关详细信息,请参阅以下 link:https://docs.oracle.com/javase/8/docs/api/index.html?java/io/InvalidClassException.html
祝你好运!希望这个回答对您有所帮助。
我试过在本地保存存档,结果成功了。问题是每次我上传文件时我使用的服务器都会损坏文件,这给了我那个例外。更改服务器即可完成工作。