#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();
}
}