2012-10-18 12 views
29

Po napisaniu kodu poniżej muszę teraz użyć niestandardowych metod readObject() i writeObject() nadpisujących w StudentData, aby odczytać i zapisać zmienne obiektu. Bez użycia metod defaultWriteObject lub defaultReadObject, aby to zrobić.Serializacja - readObject nadpisanie obiektu WriteObject

Problem polega na tym, że nie rozumiem w pełni, o co mnie proszono. Przeczytałem Uses of readObject/writeObject in Serialization, ale nie mogę się z tym pogodzić. Czy ktoś może wskazać mi właściwy kierunek?

Mój kod:

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); 
      } 
     } 
    } 
} 
+0

Dziwne zadanie. Jesteś * przypuszczalnie *, aby wywołać defaultWriteObject() i defaultReadObject(). – EJP

Odpowiedz

49

Musisz zrobić to tak:

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 jest wywoływana tuż po utworzeniu instancji Studenta (z pominięciem normalnego konstruktora).

+7

Po prostu wskaż tam szczegóły. Kolejność lub pisanie/czytanie ** jest ** ważne. W tym przykładzie pisanie brzmi: imię i nazwisko, ID, DOB, więc otrzymasz nazwę, ID, DOB podczas czytania – Manu

+3

Czy będzie działać bez pustego konstruktora? – borjab