gpt4 book ai didi

java - 需要帮助来理解在 Java 中使用 ArrayList 进行反序列化

转载 作者:行者123 更新时间:2023-11-30 08:50:33 25 4
gpt4 key购买 nike

我想将 ArrayList 写入文件,然后再读回。该列表将包含 Integer 对象。序列化似乎工作正常,但我在反序列化时遇到了问题。更具体地说,我无法正确选角。

序列化:

ObjectOutputStream ou =
new ObjectOutputStream(new FileOutputStream(new File("load.dat")));

ArrayList<Integer> ouList = new ArrayList<>();
ou.writeObject(ouList);
ou.close();

反序列化:

ObjectInputStream in =
new ObjectInputStream(new FileInputStrean("load.dat"));
ArrayList<Integer> inList = (ArrayList<Integer>)(in.readObject();
in.close();

当我编译时,我收到未经检查和不安全的警告。我使用 Xclint:unchecked 重新编译并收到以下消息:

warning: [unchecked] unchecked cast
ArrayList<Integer> inList = (ArrayList<Integer>)(in.readObject());
^
required: ArrayList<Integer>
found: Object

我觉得这有点令人困惑:转换不是应该将对象转换为 arraylist 吗?为什么它需要 ArrayList 而这正是我要将其转换到的目标?在此先感谢您的帮助。

最佳答案

它告诉您编译器无法保证转换在运行时会成功 - 它可能会产生 ClassCastException

通常您可以使用 instanceof 检查类型以防止出现此警告,例如:

if (x instanceof ArrayList) {
ArrayList y = (ArrayList) x; // No warning here
}

不幸的是,instanceof 无法在运行时检查通用参数,因此您将无法安全地执行此操作。您所能做的就是取消警告。

但是如果你真的想确定集合的类型,那么你可以用下面的方式修改你的代码:

public class ArrayListOfIntegers extends ArrayList<Integer> {}

...

// writing:
ArrayListOfIntegers ouList = new ArrayListOfIntegers();
...
// reading:
ArrayListOfIntegers inList;
Object readData = in.readObject();
if (readData instanceof ArrayListOfIntegers) {
inList = (ArrayListOfIntegers) readData;
} else {
throw new RuntimeException("...");
}

关于java - 需要帮助来理解在 Java 中使用 ArrayList 进行反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30938747/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com