Безопасность типов: выражение типа ArrayList нуждается в непроверенном преобразовании, чтобы соответствовать ArrayList? Это вызывает ClassCastException

#java #arraylist #serialization #deserialization #classcastexception

#java #arraylist #сериализацию #десериализации #classcastexception

Вопрос:

Я все еще новичок в Java, и мне нужна помощь, чтобы решить мою проблему.

Я пытаюсь написать метод для десериализации объекта, который я вызвал Student . Метод заключается в следующем:

    public void readStudentInfo() {
            // Desrializes the student objects into an ArrayList for you to compare against

            try{
                FileInputStream fis = new FileInputStream("student.ser");
                ObjectInputStream ois = new ObjectInputStream(fis);

                deserializedStudents = (ArrayList) ois.readObject();

                ois.close();
                fis.close();

            }
            catch(IOException ioe){
                ioe.printStackTrace();
                return;
            } catch(ClassNotFoundException c){
                System.out.println("Class not found");
                c.printStackTrace();
                return;
            }

            for(Student student : deserializedStudents){
                System.out.println(student.toString());
            }
            }
  

Класс Student, с которым он работает, выглядит следующим образом:

 import java.io.Serializable;

public class Student implements Serializable{
    
    private static final long serialVersionUID = 1L;

    // Class Attributes
    private String studentID;
    private String rankings;
    private char personalityType;
    private String conflict;
    
    private String preferences;

    
    // Class Constructor

    public Student(String ID){
        this.studentID = ID;
    }
    
    public Student(String ID, String grades) {
        this.studentID = ID;
        grades = grades.trim();
        this.rankings = grades;
    }

    public Student(String ID, String ranking,char personality){
        this.studentID = ID;
        this.rankings = ranking;
        this.personalityType = personality;
    }
    
    // Accessor Methods
    public String getStudentID() {
        return this.studentID;
    }

    public String getRankings(){
        return this.rankings;
    }

    public String getPreferences(){
        return this.preferences;
    }

    public char getPersonalityType(){
        return this.personalityType;
    }

    public String getConflict(){
        return this.conflict;
    }

    //Modifier Methods

    public boolean setPreferences(String pref){
        this.preferences = pref;
        return true;
    }

    public boolean setGrades(String grades){
        this.rankings = grades;
        return true;
    }

    public boolean setPersonalityType(char pers){
        this.personalityType = Character.toUpperCase(pers);
        return true;
    }

    public boolean setConflict(String ids){
        this.conflict = ids;
        return true;
    }

    @Override

    public String toString(){
        return studentID   ";"   rankings   ";"   personalityType   ";"   conflict   ";"   preferences; 
    }
    

    
}


  

ArrayList deserializedStudents инициируется в верхней части класса следующим образом: ArrayList<Student> deserializedStudents = new ArrayList<>();

По какой-то причине следующая строка readStudentInfo() выдает это предупреждение: Безопасность типов: выражение типа ArrayList нуждается в непроверенном преобразовании, чтобы соответствовать ArrayListJava(16777748)

Если я игнорирую это и запускаю программу независимо, readStudentInfo() метод выдает следующую ошибку: Exception in thread "main" java.lang.ClassCastException: class Student cannot be cast to class java.util.ArrayList (Student is in unnamed module of loader 'app'; java.util.ArrayList is in module java.base of loader 'bootstrap')

Может кто-нибудь, пожалуйста, помочь мне понять, почему это происходит? Я несколько раз пытался изменить приведение в следующей строке: deserializedStudents = (ArrayList) ois.readObject(); . Я также пытался немного изменить ситуацию, когда я инициирую ArrayList в начале программы, но пока безуспешно.

Уточнение: основная идея здесь заключается в том, что я пытаюсь десериализовать кучу объектов типа Student в ArrayList, чтобы я мог использовать их снова.

Пожалуйста, помогите!

Комментарии:

1. Куда и для чего вы точно записываете данные в student.ser

2. похоже, что в вашем входном файле есть экземпляр student, а не список

3. Вы абсолютно правы, мне, вероятно, следует внести правку, чтобы прояснить это. Мой входной файл содержит множество сериализованных объектов student. Я хочу десериализовать их в ArrayList, если это возможно

Ответ №1:

Похоже, что вы сериализовали не список студентов (который является собственным объектом), а студентов по одному. Следовательно, вам следует либо сериализовать список, либо десериализовать учеников одного за другим (путем непрерывного вызова readObject()).

Попробуйте это (используя try-with-resources):

 public void readStudentInfo() {
    try (FileInputStream fis = new FileInputStream("student.ser");
            ObjectInputStream ois = new ObjectInputStream(fis)) {
        List<Student> deserializedStudents = new ArrayList<>();
        while (fis.available() > 0) {
            deserializedStudents.add((Student) ois.readObject());
        }
        deserializedStudents.foreach(student -> System.out.println(student));
    } catch(IOException | ClassNotFoundException exc){
        exc.printStackTrace();
    }        
}