我已经构建了项目,并序列化了对象的ArrayList。它可以工作,但我知道它不能保证何时反序列化(读取)回ArrayList。它可能会遇到ClassCastException,在序列化或反序列化时如何执行安全类型检查?
我提到过:
但还是很困惑。。。
非常感谢您的帮助。
以下是我的部分代码:
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;
}
}
由于类型擦除,您只能说它是一个原始的数组列表,通过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 }
}
}
否则,可以取消显示警告。
我有一个应用程序,大部分时间都在启动,但每7次左右启动它就会崩溃,出现错误: 我引用了这个,但最终出现了类似的错误 IndexOutOfBoundsException:空列表不包含索引1上的元素。 编辑2 null ViewModel
问题内容: 我一直在尝试将对象序列化为CSV,但是该对象包含,并且不能在对象上使用。 预期样本输出 : 实际输出 : 这是我的代码 :(其中大多数是2个POJO) 我尝试的一切似乎都没有任何效果,但找不到有效的解决方案。 抱歉,我无缘无故留下的毫无意义的注释,如果您回答了代码,请随时删除它们。 问题答案: 从错误中,我想相信这与您的模式有关,该模式的列取自on 而不是值。 您可能想在其中添加,但是
场景:微服务从RabbitMQ队列中拾取消息,将其转换为对象,然后微服务对外部服务进行REST调用。 它将处理成千上万条这样的消息,如果我们知道外部Rest服务关闭,有没有办法告诉我的消费者不要从队列中拾取消息? 我知道我可以在收到一条单独的消息后重试,但如果我知道它被拒绝了,我甚至不想再收到它。我不想在DLQ中处理成千上万的消息。 而且它感觉像一个断路器设计模式,但我找不到任何具体的例子来说明如
我使用下面的代码来处理一个临时SQLite表: 将数据保存到临时:
问题内容: 好像生成带有对象的随机分布字段的JSON代码。有办法解决字段顺序问题吗? 字符串jsonRequest可以是: (正确) (顺序错误) 问题答案: 如果GSON不支持字段顺序的定义,那么其他库也可以。例如,Jackson允许使用@JsonPropertyOrder进行定义。对我来说,必须指定自己的自定义序列化程序似乎很繁琐。 是的,我同意按照JSON规范,应用程序不应期望字段的特定顺序
在浏览如何在Java中使用标记接口时,我从ObjectOutputStream类中找到了writeObject方法。它接收 Object 的实例作为输入,并且仅当给定参数是可序列化的实例时才执行序列化。 为什么writeObject方法不接收Serializable的实例作为输入,而不是Object,以便在编译时进行类型检查?将参数类型设为Object并针对Serializable执行instan