NotSerializableException при сохранении пользовательского класса
Мои два класса тоже предназначены для создания массива объектов StudentData (name, Date Of Birth и ID), которые включают переопределение toString для распечатки всех переменных. Затем он сериализует массив и сохраняет его в файл с именем studentdata.txt. Затем он должен прочитать массив из файла и восстановить новый объект массива из этих данных и распечатать каждый элемент массива на консоли.
Получаю эту ошибку при попытке завершить...
Exception in thread "main" java.io.NotSerializableException: Student
at java.io.ObjectOutputStream.writeObject0(Unknown Source)
at java.io.ObjectOutputStream.writeArray(Unknown Source)
at java.io.ObjectOutputStream.writeObject0(Unknown Source)
at java.io.ObjectOutputStream.writeObject(Unknown Source)
at StudentData.main(StudentData.java:38)
Также я не уверен, как правильно перебрать мой массив и вызвать метод toString для печати на консоль. Буду ли я прав, предполагая, что мне следует использовать a для каждого цикла? Как это?
//for (Student s : ???) {
//System.out.println(How do I call toString from here?);
Мои занятия
import java.io.*; //importing input-output files
class Student
{
String name; //declaration of variables
String DOB;
int id;
Student(String naam,int idno, String dob) //Initialising variables to user data
{
name=naam;
id=idno;
DOB=dob;
}
public String toString() {
return name+"\t"+id+"\t"+DOB+"\t";
}
}
Номер 2
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
class StudentData //main class
{
public static void main(String args[]) throws IOException //exception handling
{
System.out.println("Enter the numbers of students:");
BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
int n=Integer.parseInt(in.readLine());
Student[] S=new Student[n]; // array of objects declared and defined
for (int i = 0; i < S.length; i++) {
System.out.println("Enter the Details of Student no: "+(i+1)); //reading data form the user
System.out.println("Name: ");
String naam=in.readLine();
System.out.println("ID no: ");
int idno=Integer.parseInt(in.readLine());
System.out.println("DOB: ");
String dob=(in.readLine());
S[i]=new Student(naam,idno,dob);
File studentFile = new File("StudentData.txt");
try {
FileOutputStream fileOutput = new FileOutputStream(studentFile);
ObjectOutputStream objectOutput = new ObjectOutputStream(fileOutput);
objectOutput.writeObject(S);
S = null;
FileInputStream fileInput = new FileInputStream(studentFile);
ObjectInputStream objectInputStream = new ObjectInputStream(fileInput);
S = (Student[]) objectInputStream.readObject();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
//for (Student s : ???) {
//System.out.println();
}
}
}
3 ответа
Чтобы избавиться от NotSerializableException: Student
исключение, просто сделай свой Student
класс реализовать Serializable
интерфейс. (Обратите внимание, что это интерфейс маркера, поэтому вам не нужно реализовывать какие-либо методы.)
class Student implements Serializable {
}
Чтобы перебрать массив S
из Student
объекты, попробуйте это:
for (Student st : S) {
System.out.println(st);
}
Я бы выбрал более описательное имя для массива, хотя (students
было бы лучше). Если вы объявите массив как
Student[] students = new Student[n];
тогда ваш цикл for может быть более читабельным.
for (Student student : students) {
System.out.println(student);
}
Обратите внимание, что вам не нужно явно вызывать toString
метод объекта типа Student
, Java сделает это неявно для вас, когда вы используете объект в качестве параметра для метода, который ожидает String
,
Твой класс Student
следует реализовать Serializable
интерфейс, чтобы сделать его экземпляры serializable
,
Отредактируйте свой Student
объявление класса: -
class Student implements java.io.Serializable {
}
Смотрите эту ссылку: - http://docs.oracle.com/javase/7/docs/platform/serialization/spec/serial-arch.html Подробно рассказывается о Serialization
,
Реализовать свой студенческий класс java.io.Serializable интерфейс.