编写完下面的代码后,我现在必须使用
readObject()
中的自定义 writeObject()
和 StudentData
方法来读取和写入对象的变量,而不使用 defaultWriteObject
或 defaultReadObject
方法来执行此操作。
我无法理解我被要求做什么。我已经阅读了在序列化中使用 readObject/writeObject,但我无法理解它。有人能指出我正确的方向吗?
我的代码:
import java.io.*; //importing input-output files
class Student implements java.io.Serializable {
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";
}
}
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[] students = new Student[n];
//Student[] S=new Student[n]; // array of objects declared and defined
for (int i = 0; i < students.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());
students[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(students);
students = null;
FileInputStream fileInput = new FileInputStream(studentFile);
ObjectInputStream objectInputStream = new ObjectInputStream(fileInput);
students = (Student[]) objectInputStream.readObject();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
for (Student student : students) {
System.out.println(student);
}
}
}
}
你必须这样做:
import java.io.IOException;
class Student implements java.io.Serializable {
String name;
String DOB;
int id;
Student(String naam, int idno, String dob) {
name = naam;
id = idno;
DOB = dob;
}
private void writeObject(java.io.ObjectOutputStream stream)
throws IOException {
stream.writeObject(name);
stream.writeInt(id);
stream.writeObject(DOB);
}
private void readObject(java.io.ObjectInputStream stream)
throws IOException, ClassNotFoundException {
name = (String) stream.readObject();
id = stream.readInt();
DOB = (String) stream.readObject();
}
public String toString() {
return name + "\t" + id + "\t" + DOB + "\t";
}
}
readObject 在创建 Student 实例后立即调用(绕过普通构造函数)。
我知道这个问题已经很老了,请为后代考虑这个问题
通常,您可以通过允许自动反序列化所有“正常”字段来让 JVM 完成艰苦的工作:
private void readObject(ObjectInputStream serialized) throws ClassNotFoundException, IOException
{
serialized.defaultReadObject();
// After this, you can handle transient fields or
// special initialization that happens in the constructor
}
defaultReadObject()
的文档对此非常清楚:
从此流中读取当前类的非静态和非瞬态字段。这只能从被反序列化的类的 readObject 方法调用。如果以其他方式调用,它将抛出 NotActiveException。