需要帮助了解Java中ArrayList的反序列化吗

需要帮助了解Java中ArrayList的反序列化吗,java,serialization,arraylist,casting,deserialization,Java,Serialization,Arraylist,Casting,Deserialization,我想将ArrayList写入一个文件,然后重新读取它。该列表将包含整数对象。序列化似乎工作得很好,但我在反序列化方面遇到了问题。更具体地说,我无法得到正确的演员阵容 序列化: ObjectOutputStream ou = new ObjectOutputStream(new FileOutputStream(new File("load.dat"))); ArrayList<Integer> ouList = new ArrayList<>(); ou.wri

我想将ArrayList写入一个文件,然后重新读取它。该列表将包含整数对象。序列化似乎工作得很好,但我在反序列化方面遇到了问题。更具体地说,我无法得到正确的演员阵容

序列化:

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

ArrayList<Integer> ouList = new ArrayList<>();
ou.writeObject(ouList);
ou.close();
ObjectOutputStream ou=
新的ObjectOutputStream(新的FileOutputStream(新文件(“load.dat”)));
ArrayList ouList=新的ArrayList();
ou.writeObject(ouList);
ou.close();
去系列化:

ObjectInputStream in =
    new ObjectInputStream(new FileInputStrean("load.dat"));
ArrayList<Integer> inList = (ArrayList<Integer>)(in.readObject();
in.close();
ObjectInputStream输入=
新ObjectInputStream(新文件InputStrean(“load.dat”);
ArrayList inList=(ArrayList)(in.readObject();
in.close();
当我编译时,我得到了未检查和不安全警告。我用Xclint:unchecked重新编译,得到了以下消息:

warning: [unchecked] unchecked cast
    ArrayList<Integer> inList = (ArrayList<Integer>)(in.readObject());
                                                    ^
  required: ArrayList<Integer>
  found:    Object
警告:[未选中]未选中强制转换
ArrayList inList=(ArrayList)(in.readObject());
^
必需:ArrayList
发现:对象

我发现这有点让人困惑:强制转换不应该将对象转换为arraylist吗?当我将其强制转换为arraylist时,为什么它需要arraylist?提前感谢您的帮助。

既然您收到了未检查/不安全的警告,我建议将它们放在try/catch块中


下面是一个相对简单的教程,它正是您想要做的:

它告诉您,编译器无法保证强制转换在运行时会成功-它可能会生成
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("...");
}
公共类ArrayListFintegers扩展了ArrayList{}
...
//写作:
ArrayListFinTegers ouList=新的ArrayListFinTegers();
...
//阅读:
ArrayListOfIntegers inList;
Object readData=in.readObject();
if(ArrayListFinTegers的读取数据实例){
inList=(ArrayListFinTegers)读取数据;
}否则{
抛出新的RuntimeException(“…”);
}

如果删除.readObject()中的括号,会发生什么情况。请在.readObject()中尝试此ArrayList inList=(ArrayList);从对象强制转换泛型会导致未经检查的强制转换,删除泛型会解决未经检查的警告,但是如果您需要rawtype忽略警告,请按建议使用try/catch本教程也会引发相同的警告,只要捕获异常,就挂起这样的不安全操作是常见的吗?