当前位置: 首页 > 知识库问答 >
问题:

如何确保在序列化之前检查铸件

巴洲
2023-03-14

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

我提到过:

  1. 类型安全:未选中从对象到ArrayList的强制转换

但还是很困惑。。。

非常感谢您的帮助。

以下是我的部分代码:

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;
     }    
}

共有1个答案

锺伟志
2023-03-14

由于类型擦除,您只能说它是一个原始的数组列表,通过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