如何确保在序列化前检查演员表



我已经构建了项目并序列化了对象的ArrayList。它可以工作,但我知道它在反序列化(读取(回 ArrayList 时无法保证。它可能会遇到以下ClassCastException序列化或反序列化时如何执行安全类型检查?

我提到了:

  1. 类型安全:从对象到数组列表<我的变量的未选中转换>
  2. 如何进行格子铸造?

但还是一头雾水...

任何帮助都非常感谢。

这是我代码的一部分:

public void saveData() {
if (playerList.size() != 0) {
try {
FileOutputStream fileOut =
new FileOutputStream("players.dat.ser");
ObjectOutputStream out = new ObjectOutputStream(fileOut);
out.writeObject(playerList);
out.close();
fileOut.close();
//System.out.printf("Serialized data is saved in players.dat.ser");
} catch (IOException i) {
i.printStackTrace();
}
} else {
System.out.println("There is no data to be stored.");
} 
}

以及加载回时的代码

public void loadData() {
try {
FileInputStream fis = new FileInputStream("players.dat.ser");
ObjectInputStream ois = new ObjectInputStream(fis);
ArrayList<NimPlayer> newPlayerList = (ArrayList<NimPlayer>)ois.readObject();// warning here
setPlayerList(newPlayerList);
ois.close();
fis.close();
} catch (IOException i) {
//i.printStackTrace();
return;
} catch (NullPointerException n) {
//System.out.println("no data to be recoverd.");
//n.printStackTrace();
} catch (ClassNotFoundException c) {
//System.out.println("players.dat file not found");
//c.printStackTrace();
return;
}    
}

由于类型擦除,您能说的最好的就是它是原始ArrayList,通过instanceof。不能对泛型类型参数执行任何检查。

如果你想安全地做到这一点,那么你可以做这样的事情,检查每个项目并创建一个新列表,但涉及开销。

Object read = ois.readObject();
List<NimPlayer> newPlayerList = new ArrayList<>();
if (read instanceof List) {
for (Object item : (List<?>) read) { 
if (item instanceof NimPlayer) {
newPlayerList.add((NimPlayer) item);
}
// else { maybe throw exception, or log warning }
}
}

否则,您可以禁止显示警告。

最新更新