编程语言
首页 > 编程语言> > 为什么HashSet对象反序列化在我的代码中给出取消检查警告? | Java | IntelliJ创意|

为什么HashSet对象反序列化在我的代码中给出取消检查警告? | Java | IntelliJ创意|

作者:互联网

在我的代码中,当我尝试反序列化HashSet对象时,它向我发出以下警告:

Unchecked assignment:'java.util.HashSet' to'java.util.HashSet<java.lang.Integer>
Inspection info: Signals places where an unchecked warning is issued
by the compiler, for example:
 void f(HashMap map) {  map.put("key", "value"); }
Hint: Pass -Xlint:unchecked to javac to get more details.

这是严重警告吗?还是应该使用@SuppressWarnig?

如何消除此警告?请帮帮我,我是Java新手

我的代码是:

public class Main{
    public static void main(String[] args){
    HashSet<Integer> number=new HashSet<>();
    Scanner input=new Scanner(System.in);
    int option;
    while(true){
        System.out.println("1. add 2. display 3. save 4. load 5. exit");
        option=input.nextInt();
        if(option==1){
            System.out.println("Adding : "+ number.add(1));
            System.out.println("Adding : " + number.add(2));
        }else if(option==2){
            System.out.println("Set is : "+ number);
        }else if(option==3){
            try{
                FileOutputStream fos=new FileOutputStream("data.bin");
                ObjectOutputStream oos=new ObjectOutputStream(fos);
                oos.writeObject(number);
                oos.close();
                fos.close();
            }catch(IOException e){
                e.getMessage();
            }
        }else if(option==4){
            try{
                FileInputStream fis=new FileInputStream("data.bin");
                ObjectInputStream ois=new ObjectInputStream(fis);
                number=(HashSet)ois.readObject(); // this line give me warning
            }catch(IOException | ClassNotFoundException e){
                e.getMessage();
            }
        }else if(option==5){
            break;
        }
    }
}
}

解决方法:

没有(简便)的方式编写代码,这样您就不会收到此警告.它不是关键的,您可能会忽略它.

为什么会这样呢?

泛型是编译器想象力的伪装.您的序列化字节流仅存储您已保存的HashSet对象,而不存储< Integer>部分也不是,因为该信息在运行时不再存在.

当您存储从序列化流加载回number变量的对象时,java不知道散列集实际上是否仅包含Integer实例,并且在运行时不进行检查.例如,如果它包含字符串,就这样,然后,如果是这样,您将收到ClassCastException.

该警告特别表示:“好的,您是在断言刚刚从序列化系统获得的HashSet仅包含整数.javac没有编译时的方法来验证这一点,并且此强制转换也不会生成运行时代码来执行此操作因此,我们只是按照您的话说,所以希望您是对的!否则,ClassCastExceptions将在以后发生在怪异的地方.”

如何避免呢?

一种方法是首先为HashSet类型的变量赋值,然后遍历该变量,检查每个值是否为整数,如果为整数,则为否,如果没有,则退出此方法并显示适当的错误消息.可以强制转换集合中的单个成员,但不会收到警告..但是现在您要花额外的循环.

更好的解决方案是首先不要使用Java的内置序列化机制.它很复杂,倾向于解决安全问题,很难满足不断增长的需求(很难更改版本或从其他语言加载/写入它),它不可读,而且空间效率低.

尝试例如Jackson序列化您的对象.

标签:generic-collections,java
来源: https://codeday.me/bug/20191108/2006639.html