本地类不兼容的错误

时间:2016-07-20 03:55:22

标签: java serialization deserialization

以下代码为我提供了错误InvalidClassException我的User类实现Serializable,所以我迷路了。我正在尝试存储list填充User个对象,然后才能将其读回来。

List<User> userList = new ArrayList<User>();//list used
try {
    ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream(fileName, true));

    os.writeObject(userList);
    os.close();
} catch (IOException e1) {
    e1.printStackTrace();
}

// input
try {
    ObjectInputStream ois = new ObjectInputStream(new FileInputStream(fileName));
    userList = (List<User>) ois.readObject();
    ois.close();
} catch (FileNotFoundException e1) {
    e1.printStackTrace();
} catch (IOException e1) {
    e1.printStackTrace();
} catch (ClassNotFoundException e1) {
    e1.printStackTrace();
}

1 个答案:

答案 0 :(得分:1)

如果您尝试存储并稍后在文件中检索单个对象(示例中为List<>),则 要<每次写入文件时,strong> 追加 到文件中。相反,您希望每次使用新对象 覆盖 文件。

// Write
List<User> userList = new ArrayList<User>();
try (FileOutputStream fos = new FileOutputStream(fileName);
        ObjectOutputStream oos = new ObjectOutputStream(fos)) {
    oos.writeObject(userList);
} catch (IOException e1) {
    e1.printStackTrace();
}

// read
try (FileInputStream fis = new FileInputStream(fileName);
        ObjectInputStream ois = new ObjectInputStream(fis)) {
    userList = (List<User>) ois.readObject();
} catch (FileNotFoundException  | IOException | ClassNotFoundException e1) {
    e1.printStackTrace();
}

注意new FileOutputStream(fileName) 是否有true参数。使用true参数表示您要打开&#34;附加&#34;的文件。使用false或完全关闭追加参数,将打开&#34;覆盖&#34;的文件。

注意:

我还使用了try-with-resources语句我的例子。这消除了显式关闭流的需要;在try { }块结束时,流会自动关闭。

我还使用了multi-catch子句,因为你没有区别地处理3个例外,所以它更清晰。